2011-10-30 13 views
7

Widziałem przykład w książce pokazano ten kod:deklarowania zmiennych w @implementation

@implementation ViewController 
{ 
    NSString *name; 
} 

Dlaczego nie zadeklarować to w @interface? Jaka jest różnica w deklarowaniu zmiennych w @implementation zamiast @interface? Dlaczego zadeklarować ten NSString w zakresie?

Odpowiedz

8

Zaleta deklarowania ivars w sekcji @implementation jest lepsza enkapsulacja. W ten sposób, ivars nie muszą pojawiać się w pliku .h i dlatego nie są widoczne dla zewnętrznych użytkowników twojej klasy, którzy tylko zobaczą plik nagłówkowy. To lepiej ukrywa wewnętrzną implementację klasy.

Ogólnie rzecz biorąc, teraz, że właściwości mogą mieć auto-syntetyzowane Ivars i inne Ivars mogą być zadeklarowane bezpośrednio w bloku @implementation, nie widzę powodu, dlaczego należy zadeklarować Ivars w ogóle w swoim @interface (oprócz kompatybilności wstecznej).

Dlaczego zadeklarować NSString w zakresie?

Ponieważ jest to jedyny sposób zadeklarowania zmiennej instancji. W przeciwnym razie zadeklarowałbyś zmienną, do której można uzyskać dostęp z dowolnego miejsca w tym samym pliku (zobacz pytanie, do którego odnośnik został dołączony w swoim komentarzu).

+0

Więc jeśli zgłoszę, że NSString jest poza zakresem, czy stałoby się zmienną globalną? Mam na myśli, że wszystkie klasy zewnętrzne mogą uzyskać dostęp do zmiennej? –

+4

Sortuj; zobacz pytanie, że jakaś myśl była dupe, ponieważ obejmuje różnicę między ivars i globals/statics. Zauważ, że deklaracje ivar w '@ implementacji' są stosunkowo nowe - nie było to możliwe w 32-bitowym środowisku wykonawczym Mac OS X, ze względu na sposób generowania klas przez kompilator. Po rozwiązaniu problemu "delikatnej klasy bazowej" możliwe stało się automatyczne syntezowanie i/lub zadeklarowanie ivars poza głównym "interfejsem @". – bbum

Powiązane problemy