成员变量NSString类型指针的属性为什么用copy(属性)

时间:2021-06-26 16:40:14
  • 创建一个分类Person设置属性@property(nonatomic,strong) NSString * name;
    成员变量NSString类型指针的属性为什么用copy(属性)

  • 在- (void)viewDidLoad 中打印测试
    成员变量NSString类型指针的属性为什么用copy(属性)

  • name的属性是strong,则给name赋值的时候是强指针的name指向了可变的str的内存空间,从打印地址的结果知道,per.name 与str的地址一样,如果对可变的str做了改动( [str setString:@"好啊好啊"]),则per.name的值也会相应改变(因为他们指向的是同一个内存地址).然而这不是我们想要的结果.
  • 如果给per.name赋值了一个不可变的字符串..就不用说了,指向同一个内存地址,都不可以改变.


  • 给指针name换成copy属性
    成员变量NSString类型指针的属性为什么用copy(属性)

  • 在- (void)viewDidLoad 中打印测试
    成员变量NSString类型指针的属性为什么用copy(属性)

  • 从打印结果可以看到per.name 与可变的 str不是同一个内存地址.per.name与str是两个完全不想关的对象,则对可变的str做修改,完全不影响per.name的值.
    *如果试图对per.name做修改[per.name setString:@"hello"] ---不可以---我们的目的已经达到.
    成员变量NSString类型指针的属性为什么用copy(属性)

  • 把per.name赋值给不可变的str测试
    成员变量NSString类型指针的属性为什么用copy(属性)

  • 地址相同,不可改变.只是引用计数器+1

一个对象的准确类型取决于被分配的内存空间的类型

小结:

  • NSString的指针建议使用copy属性,它指向的如果是可变的NSMutablestring的str,则会创建新的对象(开辟新的内存空间),对原对象str做修改不会影响per.name的值.并且per.name也不能改变
  • per.name指针属性是copy,指向的不变的NSString的str,则不会创建新对象,只是引用计数+1
  • per.name指针的属性是strong的时候,如果per.name指向了课变的NSMutablestring的str,则str与per.name指针指向了同一个内存地址,str做出修改,per.name也会跟着变.
    *per.name指针的属性是strong的时候,如果per.name指向了不可变的NSString则都不能改变.
  • 总之:NSString用copy属性,都不可改变per.name的值.strong属性,看情况.