strong此特质标明该属性定义了一种拥有关系。为这种属性设定新值时,设置方法会先保留新值再释放旧值,然后再讲新值设置上去。
copy 此特质所表达的所属关系与strong类似。然而设置方法并不保留新值而是将其拷贝,当属性类型为NSString*时,经常用此特性来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例这个类是NSString的子类,表示一种可以修改其值得字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以这时就要拷贝一份不可变的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是可变的,就应该在设执行属性是拷贝一份。
现有A、B两个类,A类设置一可变字符串a , B类声明两个strong copy两个不同变量b1、b2;
B * b =[[B alloc]init];
NSMutableString * a=[@"first" mutableCopy];
B.b1=a;
B.b2=a;
分析下面两种操作对B中b1、b2影响
1️⃣[a appendString:@"+"]; / 2️⃣a=[@"second" mutableCopy];
NSLog(@"%@",B.b1);
NSLog(@"%@",B.b2);
第一种打印结果分别为first first+
第二种打印结果分别为first first
针对第一种分析:strong指向的是相同对象地址,仅仅是指针引用,增加了引用计数,这样源头改变的时候,它也会跟着改变; 而copy声明的变量,指向的是不同对象地址、它不会跟着源头改变,实际上是深拷贝。
而第二种,重新赋值相当于对于变量a又重新开辟了一段地址,而b1中记录的依旧是初始值a的地址,所以其值不发生改变。