weak和assign的區別

2021-07-22 19:30:46 字數 740 閱讀 2641

weak比assign多了乙個功能就是當屬性所指向的物件消失的時候(也就是記憶體引用計數為0)會自動賦值為nil,這樣再向weak修飾的屬性傳送訊息就不會導致野指標操作crash

#import "viewcontroller.h"

@inte***ce

viewcontroller ()

@property (nonatomic,weak) id weakpoint;

@property (nonatomic,assign) id assignpoint;

@end

@implementation

viewcontroller

- (void)viewdidload

@end

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

1.在arc模式下程式設計時,指標變數一定要用weak修飾,只有基本資料型別和結構體需要用assgin,例如delegate,一定要用weak修飾。

2.assigin 可以用非 oc 物件,而 weak 必須用於 oc 物件

weak和assign的區別

工作之後,一直使用arc,weak作為property的關鍵字之一,代表弱引用,物件的引用計數不改變。從記憶體管理上說這點和assign是相同的。倆者的不同在於 1.weak 此特質表明該屬性定義了一種 非擁有關係 nonowning relationship 為這種屬性設定新值時,設定方法既不保留...

assign 和 weak的區別

assign 和weak都是弱引用型別 用weak宣告的變數在棧中會自動清零,賦值為nil 用assign 宣告的變數在棧中可能不會自動賦值為nil,會造成野指標錯誤 在定義乙個類的property時候,為property選擇 strong 還是copy 特別注意和研究明白的,如果property是...

weak和assign的區別,以及使用場景

相同點 assgin和weak均表明該屬性定義了一種 非擁有關係 即在為此種屬性設定新值時,既不保留新值,也不釋放舊值。區別 1 weak在物件銷毀時,屬性值會置為nil,而assign只會執行對 純量型別 做簡單的賦值操作。2 assgin可以用於非oc物件,例如float bool int等型別...