2013-03-19 13 views
5

Czytam Apple Doc dla zrozumienia instancji właściwość zmienny, ale nieco zdezorientowanyPotrzebujesz pomocy w zakresie właściwości objective-c koncepcji

od Apple Doc:

większość właściwości są wspierane przez zmienne instancji Domyślnie ReadWrite Właściwość będzie wspierana przez zmienną instancji, która będzie automatycznie syntetyzowana automatycznie przez kompilator.

Zmienna instancji jest zmienną, która istnieje i utrzymuje jego wartość dla żywotności obiektu. Pamięć używana dla zmiennych instancji to przydzielana, gdy obiekt jest najpierw tworzony (poprzez przydzielanie), i zwolniona , gdy obiekt jest zwolniony.

O ile nie określono inaczej, zsyntetyzowana zmienna wystąpienia ma taką samą nazwę jak właściwość, ale z prefiksem podkreślenia. Na przykład dla właściwości o nazwie firstName zmienna syntetyzowana będzie nosiła nazwę _firstName.

Mimo to najlepsza praktyka na obiekt, aby uzyskać dostęp swoje właściwości wykorzystaniem metody dostępowe lub składni kropka, to możliwe, aby uzyskać dostęp zmiennej wystąpienia bezpośrednio z którąkolwiek z metod instancji w klasie realizacji. Przedrostek podkreślenia jasno wynika, że ​​jesteś dostępu zmienną instancji zamiast, na przykład lokalnego zmiennej:

przypadku korzystania z metody dostępowe lub składnia kropka jest najlepsze praktyki to dlaczego _ivarPropertyName użytkownik?

Po co używać ivar do prezentowania właściwości? jakie są korzyści? kiedy jabłko mówi "używanie metod dostępu lub składnia kropek to najlepsza praktyka"

Odpowiedz

6

@property deklaruje istnienie właściwości (opisującej jej interfejs), ale nie określa implementacji tej właściwości. Ale właściwości muszą przechowywać ich zawartość gdzieś. Domyślnie kompilator syntetyzuje do tego celu (i dopasowując ustawiające i pobierające). Więc normalnie możesz zignorować istnienie ivar i używać tylko dot składnia.

Postępuję zgodnie z radami Apple i staram się unikać bezpośredniego używania ivars. Ale czasami chcesz uzyskać dostęp do nieruchomości bez wywoływania jej gettera. Najczęstszym wyjątek w kodzie jest leniwie przygotowanej właściwości tylko do odczytu:

@interface MyObject : NSObject 
@property (nonatomic, readonly) id someProperty ; 
@end 

@implementation MyObject 
@synthesize someProperty = _someProperty ; // required; compiler will not auto-synthesize ivars for readonly properties 

-(id)someProperty 
{ 
    if (!_someProperty) 
    { 
     _someProperty = ... create property here 
    } 

    return _someProperty ; 
} 

@end 

Ponadto, może nie chcieć, aby wywołać getter dla właściwości w metodzie -dealloc ... na przykład właściwość timera. Aby uniknąć tworzenia czasomierza w -dealloc, dostęp do ivar bezpośrednio:

-(void)dealloc 
{ 
    [ _myTimer invalidate ] ; // don't use self.myTimer here, that would create a timer even though we're going away... 
} 

Prawdopodobnie istnieje więcej przypadków użycia. W przypadku większości właściwości nie trzeba nawet używać ivar, wystarczy użyć <value> = self.property i self.property = <new value>.

edit:

Ponadto, nie będzie jakiś dodatkowy narzut na dostęp do właściwości poprzez wiadomości wysyłki (za pomocą dot-dostępowej składni lub getter) vs bezpośrednio dostępu do ivar, ale będzie nie ma znaczenia w prawie wszystkich przypadkach.

Powiązane problemy