iOS開發中 Strong 和 weak 的深入理解

最近項目不是太忙,閑下來總結一下容易讓程序員困擾的一些問題,如有不準確的地方,還請多多指正。

ARC是蘋果為了簡化程序員對內存的管理,推出的一套內存管理機制,對象的申請和釋放工作會在運行時,由編譯器自動添加retain和release。

在開發中什么時候使用strong,什么時候使用weak,什么時候使用copy呢?

強指針Strong:

強指針:strong修飾的屬性一般不會自動釋放;
       在OC中,對象默認是強指針,在實際開放中一般屬性對象一般用strong來修飾(NSArray,NSDictionary),在使用懶加載定義控件的時候,一般也用strong

eg:
@property (nonatomic, strong) NSArray *dataList;
@property (nonatomic, strong) UILabel *label;

懶加載控件
- (UILabel *)label {
if (_label == nil) {
    _label = [[UILabel alloc] init];
}
return _label;
}

弱指針Weak:

在使用 sb 或者 xib 給控件拖線的時候,為什么拖出來的先屬性都是用 weak 修飾呢?
eg

@property (weak, nonatomic) IBOutlet UILabel *label;

原因是由于在向 xib 或者 sb 里面添加控件的時候,添加的子視圖是添加到了跟視圖 View 上面, 而 控制器 Controller 對其根視圖 View 默認是強引用的,當我們的子控件添加到 view 上面的時候, self.view addSubView: 這個方法會對添加的控件進行強引用,如果在用 strong 對添加的子控件進行修飾的話,相當于有兩條強指針對子控件進行強引用, 為了避免這種情況,所以用 weak 修飾.

注意: 
1. addSubView 默認對其 subView 進行了強引用
2.在純手碼實現界面布局時,如果通過懶加載處理界面控件,需要使用strong強指針

除此之外,我們在開發的時候用的代理 也是用 weak 進行修飾的,其目的是為了防止控件的循環引用.

@property (nonatomic, weak) id<PersonDelegate> delegate;

Copy的使用

對于 copy 的使用,網上已經有很多關于 copy 介紹, 其包括深 copy 和淺 copy, 在這里我就不再多說了,如果不太明白的話可以網上查一下資料

copy 一般用來修飾 NSString 和 block

eg:

@property (nonatomic, copy) NSString *str;

以上內容是對 strong 和 weak的個人理解,后續會持續完善,今天就寫到這里,現在要繼續寫代碼了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容