iOS開發中ARC下的assign和weak區別

我個人理解就是:weak比assign多了一個功能就是當屬性所指向的對象消失的時候(也就是內存引用計數為0)會自動賦值為nil,這樣再向weak修飾的屬性發送消息就不會導致野指針操作crash。

可能不太好理解下面我寫了一個演示程序。

OC:

//

//? ViewController.m

//? weak與assgin的區別

//

//? Created by bihongbo on 15/3/19.

//? Copyright (c) 2015年 畢洪博. All rights reserved.

//

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,weak) id? ? ? weakPoint;

@property (nonatomic,assign) id? ? assignPoint;

@property (nonatomic,strong) id? ? strongPoint;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

self.strongPoint = [NSDate date];

NSLog(@"strong屬性:%@",self.strongPoint);

self.weakPoint = self.strongPoint;

self.assignPoint = self.strongPoint;

self.strongPoint = nil;

NSLog(@"weak屬性:%@",self.weakPoint);

//? ? NSLog(@"assign屬性:%@",self.assignPoint);

}

@end

當程序中的注釋被打開時,運行程序有可能會崩潰(有時候不崩潰,你可能需要多運行幾次),這是因為當assign指針所指向的內存被釋放(釋放并不等于抹除,只是引用計數為0),不會自動賦值nil,這樣再引用self.assignPoint就會導致野指針操作,如果這個操作發生時內存還沒有改變內容,依舊可以輸出正確的結果,而如果發生時內存內容被改變了,就會crash。

結論:在ARC模式下編程時,指針變量一定要用weak修飾,只有基本數據類型和結構體需要用assgin,例如delegate,一定要用weak修飾。

看一送一:

《iOS中assign,copy,retain之間的區別以及weak和strong的區別》

? copy: 用于希望保持一份傳入值的拷貝,而不是值自身的情況,即把原來的對象完整的賦值到另外一地方,重新加載一內存區,一個地方變了不影響另一個地方的對象。

? assign:? 簡單的直接賦值,相當于說兩個對象指向同個內存區,一個地方的變了,其他的也跟著改變。

? retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數 為1

那上面的是什么意思呢?

Copy 其實是建立了一個相同的對象,而 retain 不是:

比如一個 NSString 對象,地址為 0×1111,內容為@”ABC”

Copy 到另外一個 NSString 之 后,地址為 0×2222,內容相同,新舊對象沒有變化

retain 到另外一個 NSString 之 后,地址相同(建立一個指針,指針拷貝),內容當然相 同,這個對象的 retain 值+1

assign 地址還是0x1111,內容也還是“ABC”。

也就是說,

1.strong :除NSString\block以外的OC對象

? ? ? @property(nonatomic,strong) NSArray? *<#model#>;

2.weak:各種UI控件(但不是絕對,也有控件要使用strong屬性的,但是xib中必須使用weak,因為控件被拖進xib的時候就被strong修飾了)

? ? ? @property (nonatomic,weak) UIButton *button;

3.assign:CGFloat,NSInteger等基本數據類型、枚舉、結構體(非OC對象)

? ? ?@property(nonatomic,assign) CGFloat <#model#>;

4.copy:

? ? <1. copy : 創建的是不可變副本(如NSString、NSArray、NSDictionary)

? ? <2. ?mutableCopy :創建的是可變副本(如NSMutableString、NSMutableArray、NSMutableDictionary)

? ? <3. @property(nonatomic,copy)NSString *<#model#>;

?@property內存管理策略的選擇

?1.非ARC

? 1> copy : 只用于NSString\block

? 2> retain : 除NSString\block以外的OC對象

? 3> assign : 基本數據類型、枚舉、結構體(非OC對象),當2個對象相互引用,一端用retain,一端用assign

?2.ARC

? 1> copy : 只用于NSString\block

? 2> strong : 除NSString\block以外的OC對象

? 3> weak : 當2個對象相互引用,一端用strong,一端用weak

? 4> assgin : 基本數據類型、枚舉、結構體(非OC對象)

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

推薦閱讀更多精彩內容

  • 在ARC中的assign和weak可以說非常相像,導致有很多人誤以為他們是一摸一樣的,在任何時候都可以劃等價,但事...
    火星抄手閱讀 588評論 0 1
  • 大家在用軟件時經常會要刷新某個界面,或者是加載更多的數據,隨著用戶體驗的提升在下拉刷新或者上拉加載時都會顯示一個動...
    包佳奇閱讀 1,813評論 0 9
  • 我終于可以跑十公里了,這感覺真好! 昨天早上跑了10公里,共計用時1小時17分鐘;最快一公里速度7分7秒,最慢一公...
    一只蝸牛的馬拉松閱讀 1,012評論 5 3
  • 好的壞的 回憶太過清晰 會想起你會去看你資料 可是呢 我再也不能找回你 就到這了吧
    9y閱讀 110評論 0 0