strong和copy的区别

之前在开发的过程中,对定义类的属性用stong还是copy总是有一点迷惑,现在结合代码来巩固一下认知。
定一一个Person类,类中定义两个属性,分别用stongcopy修饰。

#import 
@interface Person : NSObject

@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyString;

@end

在定义一个可变字符串,分别赋值给这两个属性,然后改变可变字符串的值,看看有什么变化。


先测strong

    Person *person = [[Person alloc] init];
    NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
    person.strongString = name;
    NSLog(@"name没改之前person.name=%@",person.strongString);
    [name setString:@"王武"];
    NSLog(@"name改之后person.name=%@",person.strongString);
    NSLog(@"name=%@,%p",name,&name);
屏幕快照 2017-12-24 下午10.11.21.png

从输出结果我们可以看到person.strongString的值在name被修改之后烨跟着修改了。根据结果知道person.strongString和name引用同一个内存地址。


现在测copy

 NSMutableString *name = [NSMutableString stringWithFormat:@"李三"];
 person.cpyString = name;
 NSLog(@"name没改之前person.cpyString=%@",person.cpyString);
[name setString:@"王武"];
 NSLog(@"name改之后person.cpyString=%@",person.cpyString);
 NSLog(@"name=%@,%p",name,&name);

屏幕快照 2017-12-24 下午10.18.21.png

输出结果是在name没有改变之后,person.cpyString没有改变。所以nameperson.cpyString没有引用同一个内存地址。


总结

  1. 当原字符串是NSString时,字符串是不可变的,不管是strong还是copy属性的对象,都是指向原对象。
  2. 当原字符串是NSMutableString时,strong属性只是增加了原字符串的引用计数,而copy属性则是对原字符串做了次深拷贝,产生一个新的对象,且copy属性对象指向这个新的对象,且这个Copy属性对象的类型始终是NSString,而不是NSMutableString,因此其是不可变的。(总结原文地址http://blog.csdn.net/xdrt81y/article/details/63251879)

你可能感兴趣的:(strong和copy的区别)