5

Więc szukają około przepełnienie stosu wydaje się być jak zrobić zmiennych prywatnych w Objective-C:Czy zmienne prywatne w Objective-C są silne?

@interface ClassName() 
{ 
@private 
    NSArray* private; 
} 
@property (strong, nonatomic) NSArray* public; 
@end 

Teraz jest to gdzie mogę się mylić. Właściwość jest zadeklarowana jako (strong, nonatomic), ale zmienna prywatna nie ma niczego w tym rodzaju. Skąd wiadomo, czy jest silny, czy nie?

+5

FYI - Kod, który wysłałeś, to stary sposób robienia rzeczy. Prywatne znaki iv należą teraz do bloku '@ implementation' w pliku .m. Ponadto, nie ma potrzeby deklarowania ivars dla właściwości. I nie ma potrzeby posiadania wyraźnego wywołania '@ synthesize'. Po prostu zadeklaruj '@ właściwość' w .h i gotowe. Kompilator automatycznie zsyntetyzuje ivar. – rmaddy

Odpowiedz

8

W przypadku nieruchomości, własność powiązanej zmiennej instancji jest dorozumiany przez własności nieruchomości:

Zobacz http://clang.llvm.org/docs/AutomaticReferenceCounting.html:

Jeżeli nieruchomość jest syntetyzowana, a następnie związany instancji zmienna to zmienna instancji, która jest określana, prawdopodobnie niejawnie, przez deklarację syntetyzowania @ @. Jeśli istnieje powiązana zmienna instancji o numerze , to jej kwalifikacja własności musi być własnością własności; w przeciwnym razie zmienna instancji zostanie utworzona z tą kwalifikacją własności .

Generalnie obiekty Objective-C są domyślnie silny:

Jeśli obiekt jest zadeklarowana wygodny do przechowywania typu właściciela obiektu, ale bez wyraźnego eliminacjach własności, jego typ jest niejawnie regulować mieć __strona kwalifikacyjna.

Należy pamiętać, że od kompilatora LLVM 4.0 (Xcode 4.4), instrukcja @synthesize i powiązana z nią zmienna instancji jest tworzona automatycznie, więc musisz tylko zadeklarować właściwość.

3

Kwalifikatory na @property określają zachowanie syntetyzowanego ustawiacza i innego wstawionego kodu ARC. Same zmienne nie są naprawdę silne, są po prostu lokalizacjami w pamięci. Więc teraz masz dobrze zakodowany kod.

Sposobem uczynienia go prywatnym (i silnym) jest zadeklarowanie go jako silnego w kategorii w pliku .m.

// .h 
// nothing 

// .m 
@interface ClassName() 
@property (strong, nonatomic) NSArray* myStrongPrivateProperty; 
@end 

// that's it 
+4

* "Zmienne same w sobie nie są zbyt silne, czy nie, są po prostu lokalizacjami w pamięci." * - To jest złe. Wszystkie obiekty Objective-C mają własność domyślnie __strong. –

+0

To metaforyczne. Ten cytat podaje konwencję o tym, jak traktować te lokalizacje pamięci. Zmienne instancji są w końcu bajtami w strukturze, nie są przechowywane z dodatkowymi bitami wyjaśniającymi, w jaki sposób powinny być traktowane w środowisku wykonawczym. To jest tabela kompilatora. – danh

+4

Jest to trochę jak powiedzenie "Zmienne instancji nie są wpisane, są po prostu bitami w strukturze". Fakt, że zmienna jest reprezentowana przez bity, nie zmienia faktu, że semantycznie ma również inne atrybuty. Zmienne mogą mieć wartość __strong lub _weak, niezależnie od tego, czy istnieje właściwość @. –

11

zmienne instancji są __strong domyślnie.

Od Apple's ARC Transition Guide, dotyczące zmiennych (przypuszczalnie zawierać zmienne instancji):

__strong jest domyślnym

i później:

Z ARC, zmienne instancji są mocne referencje domyślnie przypisywanie obiektu do zmiennej instancji bezpośrednio przedłuża żywotność obiektu

To obowiązuje, dopóki nieruchomość nie zostanie połączona z ivar poprzez @synthesize. W tym momencie pierwszeństwo ma kwalifikator własności właściwości. Jeśli jednak zadeklarujesz właściwość jako coś innego niż mocne, a następnie zaimplementujesz oba ustawiające i pobierające ręcznie, będziesz musiał ręcznie zadeklarować również kwalifikator własności ivar własności.