2012-01-30 12 views
7

W obj-C w przypadku podania zmienną w @interfaceInterfejs Obiektyw-C - zadeklarowanie zmiennej vs własność?

@interface: NSObject { MyObject * myObject}

@property (niebezpieczne nonatomic) MyObject * myObject;

Vs. Tylko zadeklarować ją jako własność

@interface: NSObject {}

@property (niebezpieczne, nonatomic) MyObject * myObject; @end

Nie zadeklarowano tutaj żadnego var?

Pozdrowienia Christian

+3

A jakie jest twoje pytanie? –

Odpowiedz

10

@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.

9

Pomijanie deklarowania ivar jest w porządku - ale nie będzie w stanie zobaczyć wartość w Ivar jest w Xcode IDE. Pewnego dnia Apple może to naprawić.

Będziesz mógł "po" ivar sprawdzić go w GDB lub lldb.

+0

+1 za to - Ostatnio dużo przeklinałem debuggera, nie przyszło mi do głowy, że oświadczenie, że ivar sprawi, że moje rzeczy będą widoczne dla debuggera! –

+0

Proszę zgłoś zgłoszenie błędu w Apple: bugreport.apple.com – zaph

Powiązane problemy