weak修饰符
2016-06-21 20:32
417 查看
一、在OC中,如果对象没有强引用,就会被自动释放,那么为什么控件还可以设为weak?
我们平时定义控件属性的时候一般都会用strong修饰符,而我们在用xib,sb拖控件的时候会发现,这时属性都是用的weak修饰符。
1. 从storyboard或者xib上创建控件,在控件放在view上的时候,已经形成了如下的引用关系,以UIButton为例:
UIViewController->UIView->subView->UIButton
然后你为这个UIButton声明一个weak属性
相当于xib/sb对这个Button是强引用,你声明的属性对它是弱引用。
2.手动创建控件
a). 将控件声明成strong
那么你在实现这个控件时只需这样:
b). 将控件声明成weak
那么你在实现这个控件时需要这样:
事实上IBOutlet的属性一般可以设为weak是因为它已经被view引用了,除非view被释放,否则IBOutlet的属性也不会被释放,另外IBOutlet属性的生命周期和view应该是一致的,所以IBOutlet属性一般设为weak。
二、下面我们来说说delegate为啥定义时要用weak修饰符,这个涉及到循环引用的问题。例如一个ViewController上通过强指针引用了一个tableview,tableview的datasource和delegate都必须是weak指针,因为viewController被他两指向,如果用strong的话,就会形成强引用循环。
我们平时定义控件属性的时候一般都会用strong修饰符,而我们在用xib,sb拖控件的时候会发现,这时属性都是用的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的话,就会形成强引用循环。
相关文章推荐
- NSURLSession强引用问题
- 再来讨论__strong 和 strong
- Block 的循环引用:如何产生 和 解决办法
- 认识retain copy assign strong weak 的区别
- OC循环引用另一种解决方案:最后你放手,换来彼此的自由!
- iOS arc机制 strong weak
- __attribute__((weak)) 博大精深的gcc ------ 关于弱符号的用法
- 升级到xcode7.3之后关于weak的错误解决方法
- block 用法以及防止循环引用
- ARC中的weak和strong
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
- 循环引用检查{"$ref":"$.data[0]"}
- ARC中内存管理相关的关键字
- block
- 关于IOS delegate的weak和assign 探讨
- iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
- IOS:代理delegate为什么要用assign或者weak
- 写给喜欢用Block的朋友(ios Block)
- iOS block循环引用精讲
- Block的基本使用