@property
definiuje interfejs, a nie implementację. W twoim przypadku definiujesz własność readwrite. Oznacza to, że obiecujesz wdrożenie -myObject
i -setMyObject:
. To nie ma nic wspólnego ze znakami iv.
Obecnie najpopularniejszym sposobem wdrożenia tych metod jest ich popieranie przez ivar. Dla wygody, ObjC umożliwia automatyczne generowanie wymaganych metod w magazynie ivar za pomocą @synthesize myObject=myObject_;
. Oznacza to "utworzenie wymaganych metod dla właściwości myObject
przy użyciu automatycznie utworzonego oprogramowania o nazwie myObject_
." Ivar myObject_
jest prawdziwym ivar i można uzyskać do niego normalny dostęp (choć generalnie nie powinien, należy użyć akcesorów).
Zamiast używać @synthesize
, można po prostu zaimplementować -myObject
i -setMyObject:
. Można nawet użyć @dynamic myObject;
, aby powiedzieć kompilatorowi "nie martw się o implementacje dla tej właściwości, będzie ona poprawnie obsługiwana w środowisku wykonawczym."
Istnieje kilka różnic między @property
i metody tylko deklarujące, ale w zasadzie to linia:
@property (nonatomic, readwrite, strong) MyObject* myObject;
jest koncepcyjnie taki sam jak ten:
- (MyObject *)myObject;
- (void)setMyObject:(MyObject *)anObject;
Deklarowanie ivar sobie nie ma prawdziwy wpływ tutaj. Nadal musisz wdrożyć metody w jakiś sposób. Jeśli nazwa ivar jest taka sama, jak ivar @synthesize
, to po prostu @synthesize
po prostu nie utworzy nowego ivar.
W praktyce zniechęcam ludzi do deklarowania ivars. Polecam po prostu używanie publicznych i prywatnych właściwości z @synthesize
, aby utworzyć wszelkie potrzebne ivars. Jeśli z jakiegoś powodu konieczny jest ręczny ivar, zalecam zadeklarowanie go w bloku @implementation
, a nie na @interface
.
A jakie jest twoje pytanie? –