定义属性时NSArray,NSString,NSDictionary为何要用copy

开始之前我们先介绍一下copy和stong的区别

  1. strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
  2. 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的改变。

你可能感兴趣的:(定义属性时NSArray,NSString,NSDictionary为何要用copy)