《iOS總結》strong和weak


例1:


@interface AController : UIViewController
{
    __weak UIView *aView;
}
@end

@implementation AController

- (void) viewDidLoad
{
    [super viewDidLoad];
    UIView *view = [[UIView alloc]initWithFrame:CGRectZero];
    [self.view addSubview:view];
    aView = view;
}

@end


控件用weak聲明,因爲Controller並不直接“擁有”控件,控件由它的父view“擁有”。使用weak關鍵字可以不增加控件引用計數,確保控件與父view有相同的生命週期。


控件在被addSubview後,相當於控件引用計數+1;父view銷燬後,所有的子view引用計數-1,則可以確保父view銷燬時子view立即銷燬。weak的控件在removeFromSuperview後也會立即銷燬,而strong的控件不會,因爲Controller還保有控件強引用。


在控件addSubview後再對weak變量賦值,防止控件被立即釋放。


例2:

ARC提供四種所有權修飾符:


strong


weak


unsafe_unretained


autoreleasing

其中前三個可以用於屬性中聲明所有權。對於這三個用於屬性聲明的修飾符,下面分別講講他們對應的使用場景。


1.strong

strong與之前的retain差不多,可以增加屬性引用計數的值。在不需要的時候,需要手動設置屬性爲nil。


2.weak

weak是iOS5及以上才支持的修飾符。它被稱爲“歸零弱引用”。可以只是持有指針而不增加引用計數來避免循環保留。當指針指向的內存被銷燬後,聲明weak的屬性指針會自動置爲nil,這也是它被稱爲歸零弱引用的原因。



3.unsafe_unretained

對於iOS5以下版本,並不支持ARC中的weak聲明,可以用unsafe_unretained聲明來代替weak。 
unsafe_unretained同樣也是不增加引用計數的值,但它沒有“歸零”的動作,需要手動操作,一般作爲支持iOS5以下weak的替代方案。


解釋了3種屬性的意義,下面說說對於屬性聲明爲IBOutlet時3種所有權修飾符的取捨以及使用技巧。

由於我自己很熟悉Interface Bulider中的操作,所以非常喜歡那種拉控件然後連線並直接聲稱屬性代碼的操作。對於直接從xib或者storyboard拉出來生成的IBOutlet屬性,一般是選擇strong還是weak呢?

這裏有個原則

如果該控件位於控件樹的頂部,比如 
UIViewController下的view,那就應該選擇strong,因爲viewcontroller直接擁有該view。例如右圖中的View。

而如果控件是viewcontroller中view的子視圖,對於這個子視圖,它的所有者是它的父視圖,代碼中只是想引用一下這個子視圖的指針而已,那麼就應該選擇weak(iOS5以下選擇unsafe_unretained)。例如左圖中的UILabel。


相關網址:http://www.cocoachina.com/bbs/read.php?tid-256626-page-1.html


慢慢學習並總結中 持續更新 = =

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