iOS屬性關鍵字

2021-09-24 22:51:57 字數 2643 閱讀 9282

常用的屬性關鍵字:assign,weak,unsafe_unretained,strong,retain ,copy,readonly,readwrite , nonatomic,natomic及 __weak,__block ,@synthesize 和 @dynamic,只有準確的理解了他們的原理,用起來才能得心應手。

1、nonatomic、atomiac

nonatomic:非原子的, atomiac 原子的 。屬性預設是 atomiac , 也就是原子性的。nonatomic執行效率高。

atomiac讀寫安全,但效率低,不是絕對的安全,比如運算元組,增加或移除,這種情況可以使用互斥鎖來保證執行緒安全

nonatomic多執行緒執行效率高。

2、readwrite、readonly

readwrite 讀寫,readonly 唯讀。 屬性預設是 readwrite , 支援讀寫。

readwirte:屬性同時具有 set 和 get 方法。

readonly:屬性只具有 get 方法。

3、strong、retain、weak、assign、copy、unsafe_unretained

retain 、assign 是 mrc 時的關鍵字,到 arc 時,換成了 strong 和 weak 。 屬性預設是 mrc -- assign ;arc -- 物件是 strong,基本資料型別還是 assign 。

4、strong、weak、assign、unsafe_unretained

strong 是每對這個屬性引用一次,retaincount 就會+1,只能修飾 nsobject 物件,不能修飾基本資料型別。是 id 和 物件 的預設修飾符。

weak 對屬性引用時,retaincount 不變,只能修飾 nsobject 物件,不能修飾基本資料型別。 主要用於避免迴圈引用。weak的原理:runtime維護了乙個weak表,用於儲存指向某個物件的所有weak指標。weak表其實是乙個hash(雜湊)表,key是所指物件的位址,value是weak指標的位址(這個位址的值是所指物件指標的位址)陣列。

assign是預設關鍵字,用來修飾基本資料型別。

對這個關鍵字宣告的屬性操作時,retaincount 是一直不變的。

為什麼我們不用assign去宣告物件呢?

因為 assign 修飾的物件,在釋放之後,指標的位址還是存在的,也就是說指標並沒有被置為nil,造成野指標。訪問野指標,會導致程式 crash。

為什麼可以用assign修飾基本資料型別?

因為基本資料型別是分配在棧上,棧的記憶體會由系統自己自動處理**,不會造成野指標。

5、unsafe_unretained

unsafe_unretained和_weak一樣,表示的是物件的一種弱引用關係,唯一的區別是:weak修飾的物件被釋放後,指向物件的指標會置空,也就是指向nil,不會產生野指標;而unsafe_unretained修飾的物件被釋放後,指標不會置空,而是變成乙個野指標,那麼此時如果訪問這個物件的話,程式就會crash,丟擲bad_access的異常。

6、copy

copy分深copy和淺copy

淺copy,物件指標的複製,目標物件指標和原物件指標指向同一塊記憶體空間,引用計數增加

深copy,物件內容的複製,開闢一塊新的記憶體空間

可變的物件的copy和mutablecopy都是深拷貝

不可變物件的copy是淺拷貝,mutable是深拷貝

copy方法返回的都是不可變物件

nsstring使用copy修飾不用strong修飾,用strong修飾乙個name屬性,如果賦值的是乙個可變物件,當可變物件的值發生改變的時候,name的值也會改變,這不是我們期望的,是因為name使用strong修飾後,指向跟可變物件相同的一塊記憶體位址,如果使用copy的話,則是深拷貝,會開闢一塊新的記憶體空間,因此可變物件值變化時,也不會影響name的值。

7、@synthesize 和 @dynamic 分別有什麼作用?

@property 有兩個對應的詞,乙個是 @synthesize,乙個是 @dynamic。如果 @synthesize 和 @dynamic 都沒寫,那麼預設的就是 @syntheszie var = _var;

@synthesize 的語義是如果你沒有手動實現 setter 方法和 getter 方法,那麼編譯器會自動為你加上這兩個方法。

@dynamic 告訴編譯器:屬性的 setter 與 getter 方法由使用者自己實現,不自動生成。(當然對於 readonly 的屬性只需提供 getter 即可)。假如乙個屬性被宣告為 @dynamic var,然後你沒有提供 @setter 方法和 @getter 方法,編譯的時候沒問題,但是當程式執行到 instance.var = somevar,由於缺 setter 方法會導致程式崩潰;或者當執行到 somevar = var 時,由於缺 getter 方法同樣會導致崩潰。編譯時沒問題,執行時才執行相應的方法,這就是所謂的動態繫結。

IOS 屬性關鍵字

ios 5之後便支援arc了,在arc的情況下物件引用分為 strong強引用 乙個物件如果有乙個及以上的強引用指向它,那麼他將不會釋放 weak弱引用 乙個物件如果只有弱應用指向它,那麼它將被釋放掉 注 兩個物件若相互保留對方的強引用,那麼會照成記憶體洩漏。其他 copy 物件的複製,複製之後得到...

iOS屬性關鍵字

readwrite readonly assign retain weak strong copy 參考文章 屬性的本質就是,例項變數 get set方法 眾多屬性關鍵字是對自動生成的get set方法進行了修飾。程式的原子性指 整個程式中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某...

iOS 宣告屬性關鍵字講解

atomic 原子操作 原子性是指事務的乙個完整操作,操作成功就提交,反之就回滾.原子操作就是指具有原子性的操作 在objective c 屬性設定裡面預設的就是atomic,意思就是setter getter函式是乙個原子操作,如果多執行緒同時呼叫setter時,不會出現某乙個執行緒執行完sett...