iOS中 assign 和 weak 修飾符的區別

2021-07-12 07:11:00 字數 1170 閱讀 1260

assign 與 weak,它們都是弱引用宣告型別,最大的區別在那呢?

如果用 weak 宣告的變數在棧中就會自動清空,賦值為 nil。

如果用 assign 宣告的變數在棧中可能不會自動賦值為 nil,就會造成野指標錯誤!

他們常用在基本型別屬性,比如 bool,int 等,還有就是 delegate。

在使用 delegate 時,需要注意,非 arc 時是使用 assign,但到了 arc 時代,都建議使用 weak,這樣更安全。

不管是在非 arc 還是 arc,使用 assign 時,都需要注意釋放:

/**

delegate, 見 ntesadmanagerdelegate

*/@property(nonatomic, assign) id

delegate;

如果你寫的 library 比較早,那時還是非 arc 的,你的 delegate 設成 assign property,這樣不會造成 circular reference。

當別人使用你的 library 的時候,記得在你自己 dealloc 的時候,把 delegate 設成 nil,以避免 crash 的事情發生。

這在非 arc 模式下是比較自然的,都會這麼去做。

// 當 myviewcontroller 的 retain count  變為0,則會 dealloc.

// 同時在 dealloc 中,也一併把 myclass release,則 myclass 也跟著被 release.

// 非 arc

-(void)dealloc

但在 arc 模式下,使用方就不會有 dealloc 處理的習慣了

// arc

-(void)dealloc

如果在 arc 下,沒有做這個邏輯的話,當頁面銷毀的時候,很可能出現 delegate 物件無效,導致程式 crash。

/**

delegate, 見 ntesadmanagerdelegate

*/@property(nonatomic, weak) id delegate;

1. 2. 

3. 

iOS中assign和weak修飾符的區別

assign與weak,它們都是弱引用宣告型別,最大的區別在那呢?如果用weak宣告的變數在棧中就會自動清空,賦值為nil。如果用assign宣告的變數在棧中可能不會自動賦值為nil,就會造成野指標錯誤!他們常用在基本型別屬性,比如bool,int等,還有就是delegate。在使用delegate...

weak和assign的區別

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

weak和assign的區別

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