weak和strong修饰符 生动解析

生动详解 weak &strong

在oc 中,如果对象没有被强引用,会被立即释放。

__weak 表示弱引用 :

 Assigning retained object to weak variable; object will be released after assignment

1.1 使用场景:

控件的使用 :
如果界面的搭建,是采用storyBoard进行连接,控件属性用weak。
如果是采用纯代码搭建界面,控件可以使用strong进行修饰;
因为此时控件的对象的两个强引用(ViewController的noLable,以及view的subview)都会随着控制器       ViewController的销毁而被释放。

[self.view addSubview:noLabel];
//将弱引用参照的noLabel添加到视图UIView;

UIViewController.h
@property(null_resettable, nonatomic,strong) UIView *view;

UIView.h 
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;
 
 强引用UILabel对象,所以这个UILabel对象已经有拥有者,不会被放--再添加过程都是操作UILabel对象的地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/e5183db671fd4f03b2fefd0c3d3b7f99.png#pic_center)
释放对象的过程:
程序先对控制器进行释放,如果没有对象对View进行强引用,程序将对view进行释放。
内存中如果没有存在对subviews 对象进行强引用,就释subviews。
此时如果UILabel对象没有被强引用,UILabel对象将被释放 。
1.2 属性的修饰
创建的自定义对象,都用strong。
因为这些对象不会有UIViewController的控制,来进行强引用。

NSString 使用copy;NSString应该使用copy而不是strong的属性特性。
即使你声明一个NSString的属性,有人可能传入一个NSMutableString的实例,然后在你没有注意的情况下修改它。

数字型的,比如int ,就是使用assign。
1.3 weak和strong的不同
当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。
一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。

例子: 
想象我们的对象是一条狗,狗想要跑掉(被释放)。  
strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。
如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。  
weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。
只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值