weak strong copy retain大杂烩

对于基础薄弱的iOS初学者来说属性的@property选择有时候是一件很模糊的事情,前几天一个朋友面试被问到这些东西。就来问我,虽然自己知道如何使用但是也说不出具体的区别。在这里有重新去深入了解了一下weak strong copy retain的使用场景和区别。有不对的地方请指出共同学习,谢谢.
在这里可以参考两篇博客博客1 博客2
strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。如果属性没有指定类型,默认是strong。
weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。在使用xid、storyboard的时候我们会发现xib/storybard连接的对象使用的是weak。那是因为控件已经摆放在控制器的view上了,已经形成了这样的引用关系,以UIButton为例:
UIViewController->UIView->subView->UIButton。如果是手动添加UIButton到view上,并且使用weak的时候我们可以这样做@property(nonatomic,weak) UIButton *btn;
UIButton *button = [[UIButton alloc]init];
_btn = button;
[self.view addSubview:_btn];

借鉴一下M了个J博客中的一段话:

weak指针主要用于“父-子”关系,父亲拥有一个儿子的strong指针,因此父亲是儿子的所有者;但为了阻止所有权循环,儿子需要使用weak指针指向父亲。典型例子是delegate模式,你的ViewController通过strong指针(self.view)拥有一个UITableView,
UITableView的dataSource和delegate都是weak指针,指向你的ViewController

strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil;
assign:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。如:int ;float等
retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容。
copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机 制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。
使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
使用copy: 对NSString 。使block作为属性时,使用copy。
使用retain: 对其他NSObject和其子类

简单的复习了一下,有什么不足的地方欢迎指正。希望能给大家带来帮助。谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值