2012-04-05 12 views
6

Posiadam własność, której nie syntetyzuję, zamiast tego sam tworzę gettera i setera. Dlatego słowa kluczowe ARC (silne lub słabe) nie mają znaczenia, jak sądzę, więc je eliminuję. Działa to dobrze na Xcode 4.3, ale kiedy mój współpracownik otwiera je na XCode 4.2, kompilator skarży się, że nie ma silnego/słabego słowa kluczowego, więc poleciłem mu, aby bez słowa wprowadzał ponownie słowo kluczowe. Który jest poprawny (z lub bez słów kluczowych)?Czy potrzebuję słów kluczowych ARC dla właściwości, których nie syntetyzuję?

Żeby było jasne: Mam właściwość jak ten @property (nonatomic) NSString *foo iw pliku .m zaimplementować -(NSString *)foo i -(void)setFoo:(NSString *)foo i nie zawierają @synthesize foo. Innym istotnym szczegółem jest to, że nie ma odpowiadającego iVar, zamiast tego właściwości współdziałają z obiektem Core Data. To nie będzie kompilować w XCode 4.2, chyba że dodaję silne lub słabe do słów kluczowych.

EDIT myślałem o jednej bardziej przydatnych rzeczy, jedna z tych właściwości jest na protokole, nie wiem, czy to robi różnicę.

Odpowiedz

1

Deklarowane atrybuty, do których się odwołujesz, są opcjonalne. Zacytować dokumentację:

deklarację właściwości i realizacja
Dyrektywa @property deklaruje właściwość. Opcjonalny zestaw nawiasów z atrybutami zawiera dodatkowe szczegóły dotyczące semantyki przechowywania i innych zachowań właściwości - zobacz "Atrybuty deklaracji właściwości" pod kątem możliwych wartości.

Deklaracja obiektu Atrybuty
Można ozdobić nieruchomość atrybutów za pomocą formularza @property(attribute [, attribute2, ...]). Podobnie jak w przypadku metod, właściwości są ograniczone do deklaracji obejmujących interfejs . W przypadku deklaracji właściwości, które używają rozdzielanej przecinkami listy nazw zmiennych, atrybuty właściwości mają zastosowanie do wszystkich nazwanych właściwości .

Jeśli użyć dyrektywy @synthesize aby poinformować kompilator do tworzenia metody dostępowe (patrz „implementacji dyrektyw Property”), kod generuje odpowiada specyfikacji podane przez słowa kluczowe. Jeśli wdrożyć metody dostępowe siebie, należy upewnić się, że odpowiada specyfikacji (na przykład, jeśli podasz skopiować trzeba upewnij się, że robisz skopiować wartość naliczonego setter).

Jeśli następnie użyć @dynamic zamiast @synthesize to mówi kompilatorowi, że będzie pisania własnych metod i zapobiega skarży gdy nie znajdzie odpowiednich metod.

Więcej informacji można znaleźć here.

+0

Interesujące ... Spróbuję dodać dynamikę i sprawdzić, czy działa na XCode 4.2 – borrrden

+1

+1, bardzo wyraźna odpowiedź – jmstone617

0

borrrden,

Po pierwsze, dlaczego zależy Ci, aby opuszczać swoją politykę pamięci w swoim oświadczeniu nieruchomości? Zapowiada konsumentom Twojej klasy, jakie są zasady. Nie chcesz, żeby to wiedzieli?

Po drugie, @synthesize nie jest nop. Jest to mechanizm, za pomocą którego język wspiera KVO. Chociaż możesz nie używać tego teraz, dlaczego miałbyś wykluczyć to użycie na przyszłość.

Szczerze mówiąc, nie używając pełnego opisu w @property ani przy użyciu @synthesize, jesteś IMO, angażując się w przedwczesną optymalizację. Twój obecny projekt nie oszczędza ci wysyłania wiadomości i zmusza cię do zarządzania, jeśli to konieczne, tworzeniem i pisaniem ivars. I tracisz cechy tego języka.

Jeśli nie masz uzasadnionego powodu, aby wyjść poza granice preferowanych schematów Obj-C v2 +, a nie zostały one wymienione, powrócę do używania standardowego wzoru. Wtedy twój problem po prostu zniknie.

Andrew

+0

Bardzo często istnieją dobre powody, by pisać własne metody. (Takich jak obliczone właściwości, sprawdzanie poprawności itp.) – lnafziger

+0

'@ synthesize' nie ma nic wspólnego z KVO. Możesz używać KVO bez pisania '@ synthesize' i jednocześnie dostarczając własne niestandardowe programy ustawiające i pobierające. –

+0

Nie chodzi o optymalizację, chodzi o logikę. Brak właściwości iVar dla tych właściwości Właściwości współdziałają z obiektami Core Data, z kolei ustawiając ich właściwości. Czy uważasz, że są one silne lub słabe? Być może to samo, co późniejsza właściwość obiektu, którą ustawiam. Nie mam nic przeciwko pisaniu ich tak długo, jak nie powoduję żadnych skutków ubocznych. – borrrden

Powiązane problemy