定义属性时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);
问题很简单,但也困扰了我一天,希望能对大家有帮助吧,我不是理论帝,只能用实际的结果来说话。

posted on 2018-07-02 21:50  oyl  阅读(190)  评论(0)    收藏  举报

导航