当我们把xib/sb的File’s owner设置为view时,即xib/sb的拥有者是view,所以IBOutlet的属性一般设置为weak,因为它已经被view引用了。除非view移除IBOutlet的属性或view本身释放,否则IBOutlet的属性也不会被释放。
1526461218923.jpg
当我们把IBOutlet的属性设置为strong时,那么当IBOutlet属性所持有的view释放时,由于IBOutlet属性被强引用,会导致无法释放。
举例说明:
WBViewController绑定一个WBViewController.xib,并在xib添加一个WBLabel(UILabel的之类重写了dealloc方法,用于观察是否释放),一个按钮。
用例一
@interface WBViewController ()
@property (nonatomic, weak) IBOutlet WBLabel *label;
@end
@implementation WBViewController
- (IBAction)btnpress:(UIButton *)sender {
[self.navigationController popViewControllerAnimated:YES];
}
当点击按钮pop掉当前controller时发现,不管将label设置为weak或者strong,label都会释放。
weak时,只有一个持有者view
释放了,WBLabel的dealloc调用了,IBOutlet释放了。
strong时,label的两个持有者controller与view
都释放了,WBLabel的dealloc调用了,IBOutlet释放了。
用例二
@interface WBViewController ()
@property (nonatomic, weak) IBOutlet WBLabel *label;
@end
@implementation WBViewController
- (IBAction)btnpress:(UIButton *)sender {
for (UIView *view in self.view.subviews) {
if ( [view isKindOfClass:UILabel.class] ) {
[view removeFromSuperview];
}
}
}
当点击按钮移除label时:
weak时,只有一个持有者view
,view的subviews移除了label,WBLabel的dealloc调用了,label释放了。
strong时,label的两个持有者controller与view
,view的subviews移除了label,view不再持有label,但是此时label设置为strong,controller持有了label,即使view移除了label,WBLabel的dealloc也不会调用,label不会释放。直到controller释放,label才会释放。
总结:
UIViewController的view属性是strong,因为controller要直接拥有view。而添加到view上的subviews,作为IBOutlet只需要设置为weak就可以了,因为他们不是controller直接拥有的,
如果将IBOutlet设置为strong,会造成IBOutlet的File’s owner释放IBOutlet时,IBOutlet属性释放不了的问题。
网友评论