2012-02-05 12 views
6

Mam pytanie dotyczące używania zmiennych pobierających i instancji. Zobaczmy przykład.iOS przy użyciu zmiennej instancji use lub metody getter

Załóżmy, że mam w pliku .h:

@property (nonatomic,strong) NSString *name 

iw pliku .m i syntetyzować, że zmienna w ten sposób:

@synthesize name = _name; 

Teraz moje pytanie brzmi: jaka jest różnica między używać:

[self.name aMethod] 

i

[_name aMethod] 

Dzięki!

Odpowiedz

8

Pierwszy uzyskuje dostęp do ivar za pomocą metody gettera. Drugi bezpośrednio uzyskuje dostęp do ivar. Ponieważ jest to prosta, zsyntetyzowana właściwość, nie ma dużej różnicy z wyjątkiem tego, że pierwsza wykonuje dodatkowe wywołanie metody. Jeśli jednak właściwość była atomowa, dynamiczna lub metoda gettera była skomplikowana, istniałaby różnica między tym, że pierwszy byłby atomowy, a drugi nie, a pierwszy byłby wyzwalaczem skomplikowanej logiki getter, podczas gdy drugi nie.

W najprostszych słowach, kompilator re-pisze pierwszego połączenia do:

[[self name] aMethod] 

natomiast druga rozmowa jest po prostu w lewo jak jest.

1
[self.name aMethod] 

jest równoważna

[[self name] aMethod] 

Zatem getter nazywa, a wiadomość zostanie wysłana do jej wyniku.

W twoim przypadku widoczny wynik będzie taki sam.

Jednakże może nie być przypadkiem, gdy getter nie był trywialny (to znaczy syntezowany).

0

Pierwsze połączenia przez odbiorcę - jest to równe [[self name] aMethod]. Drugi po prostu używa bezpośredniego dostępu.

Powinieneś zasadniczo preferować używanie akcesorów, ale są chwile, w których powinieneś odejść. Najczęstszym zdarzeniem jest stan częściowo skonstruowany, na przykład inicjator i dealloc. Powodem jest to, że powinieneś ostrożnie budować lub niszczyć swój stan, a nie interesować się semantyką interfejsu obiektu - to znaczy, używanie akcesorów może mieć negatywne behawioralne i semantyczne efekty uboczne.

Pełniejszy wykaz powodów można znaleźć tutaj: Why would you use an ivar?

Powiązane problemy