iOS面試題整理屬性的作用---[readwrite、readonly、copy、unsafe_unretained、assign、retain、weak、strong、nonatomic、atomic]
readwrite
編譯器會自動生成setter/getter方法;
可以讀、寫;
readwrite是默認的;
readonly
聲明你的屬性是只讀的,並且告訴編譯器不用自動生成setter方法;
當你嘗試給一個readonly的屬性賦值時,會Xcode提示錯誤。
copy
在iOS開發中,一般copy關鍵字用在NSString、NSArray、NSDictionary等屬性字段的修飾符。
為什麽上述屬性需要使用copy修飾呢?
假如有一個NSMutableString,現在用他給一個retain(strong)修飾 NSString賦值,那麽只是將NSString指向了NSMutableString所指向的位置,並對NSMutbaleString計數器加一,此時,如果對NSMutableString進行修改,也會導致NSString的值修改,原則上這是不允許的. 如果是copy修飾的NSString對象,在用NSMutableString給他賦值時,會進行深拷貝,及把內容也給拷貝了一份,兩者指向不同的位置,即使改變了NSMutableString的值,NSString的值也不會改變.
所以用copy是為了安全,防止NSMutableString賦值給NSString時,前者修改引起後者值變化而用的.
我這樣說你就明白了 A->B A中的一個MutableString給B中的一個Property(NSString類型)賦值 首先是能接受的,父類可以接受子類,如果是retain,僅僅是生成一個指針,計數器加一,然後指向那個MutableString。如果MString改變,B中那個跟著改變,因為是同一塊內存區域。而選擇Copy相當於又生成了一個NSString,與A中的MutableString獨立。
unsafe_unretained
unsafe_unretained就是ARC版本的assign;
對象被釋放後指針不會被置為nil,這會導致懸空指針的出現。
assign
assgin 是默認的,不更改引用計數;
一般用於基礎類型的數據(NSInteger)和C語言類型數據(int,float,double,char,bool)
assgin 對象被釋放後指針不會被置為nil,這會導致野指針的出現。
retain
釋放舊對象,並使傳入的新對象引用計數+1;
retain和strong一樣;
Apple說如果你用了retain修飾對象,它將自動被轉換為Strong;
此屬性只能用於NSObject及其子類,而不能用於Core Foundation(因為其沒有使用引用計數,需要另外使用CFRetain和CFRelease來進行CF的內存管理)
weak(iOS4 = unsafe_unretained)
告訴系統:在別人強引用它之前,盡可能的保留;不改變引用計數;
assign也是一樣的,不持有也不釋放;
weak引用是弱引用,你並沒有持有它;
weak本質上是分配一個不被持有的屬性,當引用者被銷毀(dealloc)時,weak引用的指針會自動被置為nil。
只要對象不在被強引用,那麽該對象將會被釋放,同時所有的弱指針都將被置為nil。
如果你想避免循環引用,那麽就用weak來修飾吧。
strong(iOS4 = retain)
告訴系統:把這個對象保留在堆上,直到沒有指針指向它;
換句話說:我持有這個對象,在我用完它之前你不能將其銷毀(dealloc);
只有當你需要保留該對象時才能使用strong修飾;
在ARC下使用strong不用擔心引用計數的問題,ARC會在你需在需要該對象時自動將其釋放
nonatomic
nonatomic 意味著多線程訪問變量(動態類型);
nonatomic 線程不安全(這裏指的讀寫線程的安全);
nonatomic 執行性能較高;
nonatomic 不是默認的,我們需要在屬性修飾中添加nonatomic關鍵字;
當兩個不同的進程(線程)訪問同時訪問該屬性的時候,可能得到的結果並不是我們的。
atomic
atomic 意味著只有一個線程訪問變量(靜態類型);
atomic 線程安全(這裏指的讀寫線程的安全);
atomic 執行性能比較低;
atomic 是默認的;
非垃圾收集環境(例如使用retain/release/autorelease)中的原子訪問器會使用線程鎖,確保其他線程不會影響到當前線程對該屬性的正確讀寫(getting/setting)。
T
iOS面試題整理屬性的作用---[readwrite、readonly、copy、unsafe_unretained、assign、retain、weak、strong、nonatomic、atomic]