當我們使用 Interface Builder 生成Outlet對象的時候,一般都是作爲 subview 來使用的。比如 UIViewController 的view。所以說Outlet的持有者就是superview對象,即有“父子”關係。由上一回 iPhone開發之深入淺出 (4) — ARC之循環參照 我們知道,當對象間有“父子”關係時,需要使用弱參照,以避免“循環參照”。
ViewController 本身是不會作爲Outlet的所有者的,所以使用weak property聲明。
簡化viewDidUnload
Outlet都使用weak property聲明的時候,還有一個好處,就是簡化viewDidUnload的處理。
iOS在系統內存不足的時候,UIViewController會將沒有表示的所有view做unload處理,即調用viewDidUnload接口。
所以,如果是強參照的情況下,需要釋放所有權,
@property (nonatomic, strong) IBOutlet UILabel *label;
(void)viewDidUnload { self.label = nil; // 取消強參照,釋放所有權 [super viewDidUnload]; }
如果沒有 self.label = nil 的處理,那麼 UIViewController 將不會釋放 label 的所有權;結果,系統是調用了unload,但是subview對象始終留在內存中。隨着界面上控件的增多,內存泄露會越來越大。
如果使用的是weak property聲明的話,會是怎樣的呢?
@property (nonatomic, weak) IBOutlet UILabel *label;
這時,系統在unload時,由於label沒有被強參照,更加ARC的規則,這時,label的對象即被釋放。並在釋放的同時,變量自動指向nil。
- (void)viewDidUnload {
// 這裏什麼也不用管
[super viewDidUnload];
}
其實,如果我們的viewDidUnload只是用來釋放Outlet用的話,那麼該函數也可以不被重載的。
什麼時候要用strong property
由上我們也可以看到,並不是所有的Outlet都用弱參照來聲明都是正確的;當使用Interface Builder生成的第一層的view或
者windows被作爲Outlet來使用的話,那麼不是不能聲明爲弱參照property的。(比如,Storyboard的各個scene)
理由很簡單,沒有被任何人強參照的對象,生成之後就會立刻被釋放。
綜上,當我們使用Outlet的時候,注意不同的情況來使用strong或者是weak。