@property 後面可以有哪些修飾符? 1.線程安全的 aaomic、nonatomic 2.訪問許可權的 readonly、readwrite 3.記憶體管理(ARC) assign、strong、weak、copy 4.記憶體管理(MRC) assign、retain、release 5.指定方法 ...
@property 後面可以有哪些修飾符?
1.線程安全的 aaomic、nonatomic
2.訪問許可權的 readonly、readwrite
3.記憶體管理(ARC) assign、strong、weak、copy
4.記憶體管理(MRC) assign、retain、release
5.指定方法名稱 setter = 、getter =
圍繞頭上 想到的一些問題~
什麼情況使用 weak 關鍵字,相比 assign 有什麼不同?
首先我們要先去瞭解 weak 與 assign 是什麼。
weak
弱引用,只是單純的引用某個對象,但是並未擁有該對象。既一個對象被持有無所個弱引用,只要沒有強引用指向他,那麼他就會被清除釋放
assign
用於非指針變數。
用於基礎數據類型(例如NSInteger、CGFloat)和C數據類型(int, float, double, char)另外還有id。
我們在什麼時候去使用 weak呢?
1.在ARC中,在有可能出現迴圈引用的時候,往往要通過讓其中一端使用 weak 來解決,比如:delegate 代理屬性
2.自身已經對他進行一次強引用,沒必要在強引用一次,此時也會使用 weak ,自定義IBOutlet 控制項屬性一般也使用 weak ;當然,也可以使用 strong。
weak 與 assign 的不同點:
weak 此特質表明該屬性定義了一種"非擁有關係"(nonowning relationship)。為這種屬性設置新值時,設置方法既不保留新值,也不釋放舊值。此特質同assign類似, 然而在屬性所指的對象遭到摧毀時,屬性值也會清空(nil out)。 而assign的“設置方法”只會執行針對"純量類型" (scalar type,例如 CGFloat 或 NSlnteger 等)的簡單賦值操作。assign 可以用非 OC 對象,而 weak 必須用於 OC 對象。
怎麼用 copy 關鍵字?
1.NSString、NSArray、NSDictionary 等等經常使用copy關鍵字,是因為他們有對應的可變類型:NSMutableString、NSMutableArray、NSMutableDictionary;他們之間可能進行賦值操作,為確保對象中的字元串值不會無意間變動,應該在設置新屬性值時拷貝一份。
2.block 使用 copy 是從 MRC 遺留下來的“傳統”,在 MRC 中,方法內部的 block 是在棧區的,使用 copy 可以把它放到堆區.在 ARC 中寫不寫都行:對於 block 使用 copy 還是 strong 效果是一樣的,但寫上 copy 也無傷大雅,還能時刻提醒我們:編譯器自動對 block 進行了 copy 操作。如果不寫 copy ,該類的調用者有可能會忘記或者根本不知道“編譯器會自動對 block 進行了 copy 操作”,他們有可能會在調用之前自行拷貝屬性值。這種操作多餘而低效。