定义属性时NSArray,NSString,NSDictionary为何要用copy
最早学习property的时候没有太认真学习,只知道什么类型该用什么,也没找一下为什么这么写。今天突然脑袋进水了想了一下这个问题,问了下同事,同事也是说的模棱两可的,所以只能自己找原因了。我不是理论大师,只能用实际结果来解释了,进入正题:
定义一个Person类,并定义一下属性,并设置strong
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray *array;
@property (nonatomic, strong) NSDictionary *dict;
@end
在main函数中添加下面代码
NSMutableString *str = [[NSMutableString alloc] initWithString:@"aa"];
Person *p1 = [[Person alloc] init];
p1.name = str;
[str appendString:@"bb"];
NSLog(@"\n%@\n%@", str, p1.name);
NSLog(@"\n%p\n%p", str, p1.name);
运行后得到以下结果:
2015-09-15 17:32:32.259 DeepCopy[3876:1395529]
aabb
aabb
2015-09-15 17:32:32.259 DeepCopy[3876:1395529]
0x1003037c0
0x1003037c0
根据结果可以看出来两个字符串的地址是一样的,并且只要修改了一个,另一个的值也会变。
下面将Person类中的strong改为copy,然后再次运行结果
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSArray *array;
@property (nonatomic, copy) NSDictionary *dict;
运行结果:
2015-09-15 17:34:14.917 DeepCopy[3895:1401270]
aabb
aa
2015-09-15 17:34:14.918 DeepCopy[3895:1401270]
0x10020a690
0x616125
此时两个字符串的地址不一样了,说明在给p1.name赋值的时候系统又创建了一块空间保存p1.name,这样两个字符串可以各自修改各自,互不影响了。其他两种类型也是同样的道理。一下是其他两个类型测试代码
// NSArray copy, strong
// NSMutableArray *arr1 = [[NSMutableArray alloc] initWithArray:@[@"aa", @"bb"]];
// Person *p1 = [[Person alloc] init];
// p1.array = arr1;
// [arr1 addObject:@"cc"];
// NSLog(@"\n%@\n%@", arr1, p1.array);
// NSLog(@"\n%p\n%p", arr1, p1.array);
// NSDictionary copy, strong
// NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:@{@"a": @"1"}];
// Person *p1 = [[Person alloc] init];
// p1.dict = dict;
// dict[@"b"] = @"2";
// NSLog(@"\n%@\n%@", dict, p1.dict);
// NSLog(@"\n%p\n%p", dict, p1.dict);
问题很简单,但也困扰了我一天,希望能对大家有帮助吧,我不是理论帝,只能用实际的结果来说话。
浙公网安备 33010602011771号