ios開發之深入淺出 (5) — ARC之Outlet與弱引用

使用weak property聲明Outlet

當我們使用 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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章