开始之前我们先介绍一下copy和stong的区别
- strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
- copy对应的setter方法,是将_property先release(_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property。
接下来我们用代码看下实际效果
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, copy) NSString *name1;
@property (nonatomic, strong) NSArray *array;
@property (nonatomic, strong) NSDictionary *dict;
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableString *name = [@"Tom" mutableCopy];
Person *person = [[Person alloc] init];
person.name = name;
person.name1 = name;
[name appendString:@",jim"];
NSLog(@"name:%@", name);
NSLog(@"peron.name:%@", person.name);
NSLog(@"person.name1:%@", person.name1);
NSLog(@"name:%p", name);
NSLog(@"peron.name:%p", person.name);
NSLog(@"person.name1:%p", person.name1);
}
return 0;
}
看下打印的结果
2017-01-13 14:16:14.317 Test[1714:1088765] name:Tom,jim
2017-01-13 14:16:14.318 Test[1714:1088765] peron.name:Tom,jim
2017-01-13 14:16:14.318 Test[1714:1088765] person.name1:Tom
2017-01-13 14:16:14.318 Test[1714:1088765] name:0x100304bb0
2017-01-13 14:16:14.318 Test[1714:1088765] peron.name:0x100304bb0
2017-01-13 14:16:14.318 Test[1714:1088765] person.name1:0x6d6f5435
从打印结果我们看到,使用strong修饰的person. name输出是Tom,jim,而使用copy修饰的person. name1输出是Tom。这下可以看出来区别了吧。
备注
使用strong,则person.name与可变字符串name指向同一块内存区域,name内容改变,导致person.name的内容改变,因为两者是同一个东西;而使用copy,person.name1在赋值之前,将name内容复制,创建一个新的内存区域,所以两者不是一回事,name的改变不会导致person.name1的改变。