2015-07-04 3 views
8

Я свежее в iOS, и я хочу знать, что, когда мы должны использовать copy в свойстве, например.копия vs сильные свойства

@property (nonatomic, retain) NSString* name; 

против

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

В чем разница между retain и copy, и когда я должен использовать один, а не другой?

+0

Как правило, я использую сохранение для объектов типа NSString, array и других переменных. но когда я беру выходы UIView или любой экземпляр как UIViewController, я принимаю сильные решения. На самом деле я не знаю разницы. –

+4

@ArpitParekh strong === сохранить: http://stackoverflow.com/questions/7796476/property-definitions-with-arc-strong-or-retain – DanZimm

+0

Но, когда я беру UIViewController как переменную, и мне нужно назначьте его как сильный, если я сделаю это как удержание, тогда мое приложение выйдет из строя ... эта ссылка поддерживает это. При добавлении его в качестве подчиненного http://stackoverflow.com/questions/9144959/how-to-retain-view-after-addsubview-of-uiviewcontroller-with-arc –

ответ

3

Если NSString is mutable, тогда он получает copied. Если это не так, то это retained Если вы будете использовать copy, будет создана новая копия для этой строки, а также другой адрес памяти. Принимая во внимание, что если вы будете использовать retain, тогда он будет находиться в том же адресе памяти, что и счетчик сохранения будет изменен.

+0

Вы имеете в виду, что когда в свойствах, если свойство NSString, то я использую сохранение и когда я использую NSMutableString, тогда мне нужно использовать COPY правильно? –

+0

NSString никогда не изменяет. Следовательно, необходимость в NSMutableString ... – DanZimm

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

лучше, поскольку NSString неизменна и это дочерний класс NSMutableString изменчив.

До тех пор, пока вы используете NSString, вы не увидите никакой разницы. Но когда вы начинаете использовать NSMutableString, все может стать немного рискованным.

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."]; 

Если бы это было просто сохранить это изменило бы отдел p1. Так что в этом случае предпочтительна копия.

Смежные вопросы