天天看點

iOS中assign和weak修飾符的差別一、差別二、執行個體

一、差別

assign與weak,它們都是弱引用聲明類型,最大的差別在那呢?

如果用weak聲明的變量在棧中就會自動清空,指派為nil。

如果用assign聲明的變量在棧中可能不會自動指派為nil,就會造成野指針錯誤!

二、執行個體

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

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

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

iOS中assign和weak修飾符的差別一、差別二、執行個體

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

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

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

iOS中assign和weak修飾符的差別一、差別二、執行個體

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

iOS中assign和weak修飾符的差別一、差別二、執行個體

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

是以,在我們使用網上下載下傳的開源庫或者時間比較久的代碼時,記得檢查delegate的修飾符,如果是assign的需要及時修改為weak。

iOS中assign和weak修飾符的差別一、差別二、執行個體

參考:

1. http://stefan321.iteye.com/blog/1593869

2.http://lizhuang.iteye.com/blog/1989337

3. http://94it.net/a/jingxuanboke/2014/1218/427909.html