2015-07-04 10 views
8

Jestem świeższa w iOS i chcę wiedzieć, że kiedy powinniśmy użyć copy w nieruchomości, np.kopiowanie vs silne właściwości

@property (nonatomic, retain) NSString* name; 

vs

@property (nonatomic, copy) NSString* name;` 

Jaka jest różnica między retain i copy i kiedy należy użyć jednego, ale nie inne?

+0

Ogólnie używam retain dla obiektów takich jak NSString, tablica i inne zmienne. ale kiedy biorę ujścia UIView, lub jakikolwiek Instan jako UIViewController biorę silny. Inaczej nie znam różnicy. –

+4

@ArpitParekh strong === zatrzymaj: http://stackoverflow.com/questions/7796476/property-definitions-with-arc-strong-or-retain – DanZimm

+0

Ale, kiedy biorę UIViewController jako zmienną, i muszę przypisz go jako silny, jeśli zrobię to jako zachowaj, to moja aplikacja się zawiesza ... to łącze obsługuje to. Po dodaniu go jako podglądu http://stackoverflow.com/questions/9144959/how-to-retain-view-after-addsubview-of-viewviewontrol-with-arc –

Odpowiedz

3

Jeśli NSString jest mutable, otrzyma numer copied. Jeśli nie, to jest retainedJeśli użyjesz copy, zostanie utworzona nowa kopia dla napisu, stąd też inny adres pamięci. Natomiast jeśli użyjesz retain, to będzie to ten sam adres pamięci, tylko zmieni się licznik zatrzymania.

+0

Masz na myśli to, że w własności, jeśli właściwość NSString używam zachować i kiedy używam NSMutableString to muszę użyć KOPIUJ prawy? –

+0

NSString nigdy nie jest zmienny. Stąd potrzeba NSMutableString ... – DanZimm

9
@property (nonatomic, copy) NSString* name; 

jest lepsza, jak NSString jest niezmienna i jest to klasa dziecko NSMutableString jest zmienny.

Dopóki używasz NSString przez całą drogę, nie zobaczysz żadnej różnicy. Ale kiedy zaczniesz używać NSMutableString, rzeczy mogą stać się mało ryzykowne.

NSMutableString *department = [[NSMutableString alloc] initWithString:@"Maths"]; 

Person *p1 = [Person new]; 
p1.department = department; 

//Here If I play with department then it's not going to affect p1 as the property was copy 
//e.g. 
[department appendString:@"You're in English dept."]; 

gdyby było po prostu zachować to zmieniły Departamentu p1. Zatem posiadanie kopii jest zalecane w tym przypadku.

Powiązane problemy