iOS中copy属性与setter赋值

这样定义时,下面两种写法会是什么结果 ?
@property (copy) NSMutableArray* test;

写法1
NSMutableArray* arr = [NSMutableArray arrayWithObjects:@1,@2, nil];
self.test = arr;
[self.test removeObjectAtIndex:0];

写法2
NSMutableArray* arr = [NSMutableArray arrayWithObjects:@1,@2, nil];
_test = arr;
[self.test removeObjectAtIndex:0];

设为copy 属性之后,利用setter赋值拷贝的是不变的数据即NSArray,所以方法1会崩溃,而方法二是直接给变量赋值,应该是默认的__strong 属性,下面验证一下
这里写图片描述
地址是一样的,说明不是拷贝
这里写图片描述
执行这句话之后
这里写图片描述
再次证明是引用关系
把arr置为nil之后
这里写图片描述
说明是强引用关系
另外函数内开辟的空间,如果通过返回值返回回来之后是会一直存在的,直到autorelease}结束。
说明内部定义的变量是属于强引用,也就是说变量的默认属性是强引用,除非定义了weak

上述例子也说明retain/copy/assign是在setter内实现的,如果跳过setter上述属性将会失效

weak属性用不用setter是一样的
unsafe_unretain与weak的区别在于,当被引用的对象置为nil后,weak变量也会置为nil, 而unsafe_unretain的则变成野指针,访问可能会崩溃。

NSString* a = @”test”;
__weak NSString* b = a;
b = nil; //此时对b的修改并不影响a; 但是如果是a修改的话,b的值也会一起变化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

perman_scut

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值