iOS開發之關鍵字nonatomic、assign、retain和copy的認識
nonatomic、assign、retain和copy的認識
nonatomic
指非原子性訪問,不加同步,多執行緒併發訪問會提高效能。如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。atomic是ObjectC中使用的一種執行緒保護技術,基本上來講,是防止在寫未完成的時候被另外一個執行緒讀取,造成資料錯誤。而這種機制是耗費系統資源的,所 以在iPhone這種小型裝置上,如果沒有使用多執行緒間的通訊程式設計,那麼nonatomic是一個非常好的選擇。
assign
簡單賦值,修改變數內容,不更改變數的索引計數,對基礎資料型別(NSInteger)和C資料型別(int, float, double, char等)
當資料型別為int、float等原生型別時,可以使用assign,否則可能導致記憶體洩露。例如當使用alloc分配了一塊記憶體,並把它的地址賦值給了指標a,後來如果希望指標b也共享這塊記憶體,於是將a賦值給(assgin)b。這時就用到了assgin,此時a和b指向同一塊記憶體。但是現在問題出現了,當a不再需要這塊記憶體時,能都直接釋放呢?肯定是不能的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這塊記憶體的時候引起程式crash掉。
retain屬性
retain屬性就是為了解決上述問題而提出的,使用了引用計數(reference counting),還是上面那個例子,我們給那塊記憶體設一個引用計數,當記憶體唄分配並且賦值給a時,引用計數是1.當把a賦值給b時引用計數增加到2.這時如果a不再使用這塊記憶體,它只需要把引用計數減1,表明自己不再擁有這塊記憶體。b不再使用這塊記憶體時也把引用計數減1.當引用計數變為0的時候,代表該記憶體不再被任何指標所引用,系統可以直接釋放掉。此時系統自動呼叫dealloc函式,記憶體被回收。
copy屬性
copy是你不希望a和b共享一塊記憶體時會使用到。a和b各自有自己的記憶體。
copy是完全複製一段棧記憶體,所以copy出來的物件與原來的物件是兩個不同地址的物件。
好了,接下來我們看看arc模式下,strong和weak的區別及用法。
strong
當棧記憶體只要有兩個或者兩個以上指標指向的時候,對其中指標進行滯空操作都不會釋放掉棧記憶體,也就是strong出來的物件,對於棧記憶體有控制權,還有一點,arc下預設的賦值方式就是strong。
weak
weak出來的兩個物件的棧記憶體是一樣的,但是當我們某一個物件滯空後,另一個物件指向的棧記憶體也變為空,這就是weak與strong的區別,也就是weak出來的物件,對於棧記憶體沒有控制權。