美文网首页
weak修饰符

weak修饰符

作者: 庚妖素 | 来源:发表于2017-05-05 15:15 被阅读0次

如果是有别的对象引用着他,就用weak,不然就用strong

如果没有对象引用他,他创建完出了作用域,就会remove

还有就是当xib或者storyboard中拖物过来的,那么此时是用weak,

1. 从storyboard或者xib上创建控件,在控件放在view上的时候,已经形成了如下的引用关系,以UIButton为例:

UIViewController->UIView->subView->UIButton

然后你为这个UIButton声明一个weak属性

@property(nonatomic,weak) IBOOutlet UIButton *btn;

相当于xib/sb对这个Button是强引用,你声明的属性对它是弱引用。

2.手动创建控件

a). 将控件声明成strong

@property(nonatomic,strong) UIButton *btn;

那么你在实现这个控件时只需这样:

_btn = [[UIButton alloc]init];

[self.view addSubview:_btn]

b). 将控件声明成weak

@property(nonatomic,weak) UIButton *btn;

那么你在实现这个控件时需要这样:

UIButton *button = [[UIButton alloc]init];

_btn = button;

[self.view addSubview:_btn];

事实上IBOutlet的属性一般可以设为weak是因为它已经被view引用了,除非view被释放,否则IBOutlet的属性也不会被释放,另外IBOutlet属性的生命周期和view应该是一致的,所以IBOutlet属性一般设为weak。

二、下面我们来说说delegate为啥定义时要用weak修饰符,这个涉及到循环引用的问题。例如一个ViewController上通过强指针引用了一个tableview,tableview的datasource和delegate都必须是weak指针,因为viewController被他两指向,如果用strong的话,就会形成强引用循环。

相关文章

网友评论

      本文标题:weak修饰符

      本文链接:https://www.haomeiwen.com/subject/gzfstxtx.html