1. 程式人生 > >iOS面試題整理屬性的作用---[readwrite、readonly、copy、unsafe_unretained、assign、retain、weak、strong、nonatomic、atomic]

iOS面試題整理屬性的作用---[readwrite、readonly、copy、unsafe_unretained、assign、retain、weak、strong、nonatomic、atomic]

play retain 類型 shadow 只讀 mutable point 們的 ase

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]