复制与强大的属性

时间:2015-07-04 05:48:40

标签: ios objective-c iphone cocoa

我在iOS中比较新鲜,我想知道我们应该在属性中使用copy,例如

@property (nonatomic, retain) NSString* name;

VS

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

retaincopy之间的区别是什么?我何时应该使用一个而不是另一个?

2 个答案:

答案 0 :(得分:10)

@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的部门。 因此,在这种情况下首选副本。

答案 1 :(得分:4)

如果NSStringmutable,则会获得copied。如果不是,则为retained 如果您将使用copy,则将创建该字符串的新副本,因此也会创建不同的内存地址。然而,如果您将使用retain,那么它将位于相同的内存地址中,只有保留计数器才会更改。