首先有一点,在OC中,如果对象没有强引用,就会被自动释放,那么为什么控件还可以设为weak?
从storyboard或者xib上创建控件,在控件放在view上的时候,已经形成了如下的引用关系,以UIButton为例:
UIViewController->UIView->subViews->UIButton
然后你为这个UIButton声明一个weak属性
@property (weak, nonatomic) IBOutlet UILabel *noLabel;
当我们把xib/sb的File’s owner设置为view时,即xib/sb的拥有者是view,所以IBOutlet的属性一般设置为weak,因为它已经被view引用了。除非view移除IBOutlet的属性或view本身释放,否则IBOutlet的属性也不会被释放。
当我们把IBOutlet的属性设置为strong时,那么当IBOutlet属性所持有的view释放时,由于IBOutlet属性被强引用,会导致无法释放。