2009-09-05 13 views
5

Jaka jest różnica między:c Cel - statyczne członkowie i stałe

@interface SomeClass : NSObject { 
    NSObject *something; 
} 

i

@interface SomeClass : NSObject { 

} 
NSObject *something; 

? Ponadto, jaka jest różnica między final Java i Objective C (C) const? I gdzie powinienem zadeklarować statycznych członków klasy w następujących sytuacjach: 1. Gdy tylko klasa tego potrzebuje ** 2. ** Gdzie byłaby własność, którą inne klasy mogłyby przeczytać? Już wiem o #define, ale to nie jest dobre dla obiektów, ponieważ tworzy za każdym razem nowe. Dzięki!

Odpowiedz

7

Pierwszy przypadek jest zmienna i tworzy something dla każdego wystąpienia SomeClass. Jest podobny do C, który jest w C, który deklaruje globalną zmienną, która nie ma rzeczywistego związku z SomeClass. W języku C jest to odpowiednik zdefiniowanego w zasięgu globalnym. Objective-C tak naprawdę nie ma zmiennych klasowych, więc używane są zmienne globalne (raczej są one czasami używane, zmienne o zasięgu compilation unit i statyczne storage class są tym, co powinno być używane).

najczystszy sposób definiowania zmiennej „klasa” jest zdefiniowanie zmiennej statycznej w pliku implementacji. W ten sposób tylko metody klasy mogą uzyskać do niego dostęp, a Ty unikasz zanieczyszczania globalnej przestrzeni nazw. Jeśli chcesz, aby było publicznie dostępne, zdefiniuj akcesoria.

Właściwe niszczenie zmiennych klasowych może być trudne. Pamięć zostanie odzyskana, a otwarte pliki zostaną automatycznie zamknięte po wyjściu aplikacji, ale inne zasoby mogą nie być tak dobrze obsługiwane.

2

Jeśli chodzi o pytanie "ostateczny vs const", oba są podobne. Twierdzą, że wartość nie może się zmienić. Zauważ, że w Javie, ponieważ wszystkie wartości (oprócz prymitywów) są wskaźnikami, wskazywany obiekt może się zmienić pod spodem, ale lokalizacja pamięci (wskaźnik) nigdy się nie zmieni. Wierzę, że spodziewałbyś się podobnego zachowania w Objective C i zawsze dobrze jest nie dopuścić do tego, aby elementy, które można zmienić, były "ostateczne" lub "const", ponieważ wartości wewnątrz obiektu mogą być w dalszym ciągu modyfikowane.

+0

Należy zauważyć, że "końcowy" jest podobny do wskaźnika const ("' * const ""), a nie wskaźnik do stałej ("' const * ""). Jest również bardzo podobny do typów referencyjnych C++ ("' & ""). – outis

+0

Dziękuję za wyjaśnienie, że - ja zawsze mylić szczególne przypadki :) – aperkins

+0

Jeśli uważasz, że to dziwne, sprawdź: http://www.strainu.ro/programming/c/a-little-fun-with-cdecl/ – outis