2013-09-04 15 views
11

Czy istnieje jakaś różnica między deklarowaniem zmiennej instancji private w nagłówku a deklarowaniem jej w implementacji?zmienne instancji w @ interfejsie; nagłówek kontra implementacja

w TestObj.h

@interface TestObj : NSObject 
{ 
    int test; 
} 
@end 

vs w TestObj.m

@interface TestObj() 
{ 
    int test; 
} 
@end 

Oba wydają równowartość mnie, czy istnieje rzeczywista różnica między deklarowania zmiennej instancji w nagłówku vs we wdrażaniu , jeśli nie, który jest preferowany? Plik @interface w pliku implementacyjnym wydaje się być sposobem deklarowania własności prywatnych, czy ma jakiś inny cel poza tym?

Odpowiedz

14

Preferowane jest umieszczanie prywatnych zmiennych i właściwości instancji w prywatnym rozszerzeniu klasy (w .m) i pozostawienie publicznego pliku interfejsu (.h) dla tych właściwości i metod, które są częścią interfejsu publicznego.

Pomaga oddzielić szczegóły implementacji od interfejsu publicznego i sprawia, że ​​wszystko jest o wiele czystsze. Zapewnia również, że klasy zewnętrzne nie zmieniają nieumyślnie zmiennych prywatnych tej klasy.

Zobacz Class Extensions Extend the Internal Implementation. Komentarz

+0

Aby wyjaśnić, poza organizacją, nie ma różnicy funkcjonalnej między tymi dwoma? –

+0

@KevinDiTraglia Prawidłowe, brak różnic funkcjonalnych w klasie 'TestObj', ale zapewnia, że ​​klasy zewnętrzne nie mimowolnie nie radzą sobie ze zmiennymi prywatnymi. To wydaje mi się czymś więcej niż tylko "organizacyjnym" szczegółem, ale raczej krytycznym w tworzeniu solidnego kodu. – Rob

+6

Istnieje jedna różnica funkcjonalna: ivars w klasie '@ interface' są domyślnie" @ protected ", a ivars w rozszerzeniu klasy' @ interface' lub '@ implementation' to domyślnie' @ private'. –

7

Greg Parker na przyjętym odpowiedź jest najlepszą odpowiedzią na:

Jest jedna różnica funkcjonalna: Ivars w klasie na @interface@protected domyślnie i Ivars w @interface rozszerzenie klasy lub w @implementation domyślnie są @private.

+0

Powiedzmy, że robisz SDK z prywatnym rozszerzeniem klasy w swoim własnym TestObj_Private.h, musisz wtedy zadeklarować ivar jako @chroniony? – malhal

Powiązane problemy