深度解析copy与strong的区别

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的地址,所以其值不发生改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值