2013-08-30 14 views
15

Mam element PaneBean, jak pokazano powyżej.Czy powinienem używać @property (nonatomic, copy) lub @property (nonatomic, strong) dla mojego (NSString *) attr w obiekcie?

Czy powinienem użyć @property(nonatomic,copy) lub @property(nonatomic,strong) dla mojego (NSString *) name? Jaka jest różnica między nimi?

Czy można napisać "przypisz" do NSIntegera?

Każda pomoc doceniona. Dziękujemy z góry!

+6

Niezwiązane z odpowiedzią, możesz rozważyć naukę nazewnictwa Cocoa i konwencje projektowe. "Fasola" jest w dużym stopniu terminem Java, a programiści kakao, z którymi możesz pracować, są mało prawdopodobne, aby to zrozumieć. –

+0

oh, tak. Będę edytować. – kongkong

+0

@Catfish_Man to musi być wyprowadzane z języka Java do translatora ObjC, "CocoaBeans";) – justin

Odpowiedz

15

"Kopiuj" spowoduje, że osoba ustawiająca dla tej właściwości stworzy kopię obiektu, oraz w przeciwnym razie jest identyczny z silnym. Użyjesz tego, aby upewnić się, że jeśli ktoś ustawi twoją własność na zmienny łańcuch, a następnie zmodyfikuje ciąg, nadal będziesz miał oryginalną wartość. Jeśli ciąg nie jest zmienny, Cocoa zoptymalizuje operację kopiowania, co jest miłe :)

"silny" będzie utrzymywać wartość nieruchomości przy życiu, dopóki nie zostanie ustawiony na coś innego. Jeśli chcesz uzyskać przychodzących zmienne łańcuchy, aby zmienić się spod Ciebie (nie niemożliwe, ale nie wszystko, co często, rzeczą, którą chcesz), to silne byłoby właściwe. Ogólnie silniejszy jest bardziej przydatny dla obiektów, które reprezentują coś bardziej złożonego niż zwykła "wartość" (tj. Nie NSString, NSNumber, NSValue itp.).

"Przypisanie" jest domyślnym (a nawet jedynym) możliwym ustawieniem dla liczby całkowitej. Liczby całkowite nie mogą być zatrzymywane lub kopiowane jak obiekty.

+0

Ponieważ assign jest jedynym możliwym ustawieniem wartości skalera, nigdy nie powinieneś go jawnie określać. Apple mówi to wielokrotnie w dokumentach. Widziałem doświadczonych programistów, którzy popełnili ten błąd. – smileBot

7

Dla atrybutów, których typ jest niezmienną klasą wartości, która jest zgodna z protokołem NSCopying, prawie zawsze należy podać kopię w deklaracji @property. Określanie zachowania jest coś, czego prawie nigdy nie chcą w taki situation.In non ARC silny będzie działać jak zachowują

Oto dlaczego chcesz to zrobić:

NSMutableString *someName = [NSMutableString stringWithString:@"Chris"]; 
Person *p = [[[Person alloc] init] autorelease]; 
p.name = someName; 
[someName setString:@"Debajit"]; 

Obecna wartość nieruchomości będzie Person.name różnią się w zależności od tego, czy nieruchomość zostanie zadeklarowana jako zachowaj, czy skopiuj - będzie to "Debajit", jeśli nieruchomość zostanie oznaczona jako zachowaj, ale @ "Chris", jeśli nieruchomość jest oznaczona jako kopia.

Ponieważ prawie we wszystkich przypadkach nie można zmutować atrybutów obiektu za jego plecami, należy oznaczyć właściwości reprezentujące je jako kopię. (I jeśli sam napiszesz settera zamiast używać @synthesize, powinieneś pamiętać, aby użyć kopii zamiast zachować ją.)

1

Mocny oznacza kompozycję, natomiast Słaby oznacza agregację.

Kopiuj oznacza, że ​​nowy obiekt ma zostać utworzony, zanim zawartość starego obiektu zostanie skopiowana do nowego obiektu. Obiekt będący właścicielem, PaneBean w tym przypadku, będzie składał się z nowo utworzonego obiektu.

2

copy wysyła wiadomość o nazwie copy do ustawionego obiektu, natomiast strong zachowuje ją tylko (zwiększa liczbę odwołań).

Na NSString lub ogólnie dowolny inmutable klasy ze znanymi modyfikowalnych podklasy (NSArray, NSDictionaty, NSSet) kopia jest preferowane, aby uniknąć klientów wyznaczając zmienny wystąpienie i modyfikacji z obiektem.

Dla typów pierwotnych (np. Int) kopia/silna nie ma sensu i domyślnie używana jest opcja assign. To zależy od Ciebie, jeśli chcesz to wyraźnie wyrazić.

Powiązane problemy