iOS屬性關鍵字

2021-10-08 20:14:55 字數 2485 閱讀 1596

readwrite、readonly

assign、retain、weak、strong、copy

參考文章

屬性的本質就是,例項變數+get+set方法

眾多屬性關鍵字是對自動生成的get、set方法進行了修飾。

程式的原子性指:整個程式中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。

比如張三給李四轉賬。

如果張三的錢扣完,銀行系統癱瘓了,怎麼辦呢?張三的1000塊錢會被會沒呢,當然不會。這時候你的錢會退回來。也就是說銀行的轉賬業務要麼成功張三(1000元)李四(3000元),要麼不發生張三(2000元)李四(2000元)。

atomic :系統自動生成的getter/setter方法會進行加鎖操作;可以理解過讀寫鎖,可以保證讀寫安全;較耗時;

nonatomic : 系統自動生成的getter/setter方法不會進行加鎖操作;但速度會更快;

也就是說atomic保證了讀寫的原子性。

為什麼說atomic執行緒不安全呢?

單執行緒安全,多執行緒不安全。

因為在多執行緒下得到的資料不可靠。

例子一:

當使用atomic時,雖然對屬性的讀和寫是原子性的,但是仍然可能出現執行緒錯誤:當執行緒a進行寫操作,這時其他執行緒的讀或者寫操作會因為該操作而等待。當a執行緒的寫操作結束後,b執行緒進行寫操作,然後當a執行緒需要讀操作時,卻獲得了在b執行緒中的值,這就破壞了執行緒安全
atomic保證了讀寫的安全,沒有多條執行緒同時訪問一塊共享資源,內部使用自旋鎖而不是互斥鎖。

這裡產生的不符合預期的結果應由程式設計師承擔,atomic起到了作用。

但是這裡依然是執行緒不安全,和多條執行緒同時讀寫一樣。

這個例子顯然不夠好,因為你要修改資料,得先讀,讀完就不一定能寫。因為此時其他執行緒等待讀操作後,可能就進行了寫。

例子二:

如果定義屬性nsinteger i是原子的,對i進行i = i + 1操作就是不安全的; 因為原子性只能保證讀寫安全,而該表示式需要三步操作:

1、讀取i的值存入暫存器;

2、將i加1;

3、修改i的值;

如果在第一步完成的時候,i被其他執行緒修改了,那麼表示式執行的結果就與預期的不一樣,也就是不安全的 。

因為它的自旋鎖只保證了讀和寫不在同一時間進行

例子三更好說明:

使用atomic的關鍵字是絕對讀寫安全的。

而屬於執行緒不安全。上面的例子二說明了原因。

先看看原始碼

static inline void reallysetproperty(id self, sel _cmd, id newvalue, ptrdiff_t offset, bool atomic, bool copy, bool mutablecopy) 

id oldvalue;

id *slot = (id*) ((char*)self + offset);

if (copy) else if (mutablecopy) else

if (!atomic) else

objc_release(oldvalue);

}

setter和getter方法都有自旋鎖。保證了同一時間只有乙個執行緒在進行讀或寫操作,而不是(讀寫)。

readwrite是預設屬性。

如果新增了readonly,對屬性進行寫操作會報錯

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

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

retain關鍵字。

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

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

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

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

assign和retain對應了arc下的weak和strong。

strong 和copy。

主要看看copy。使用了copy關鍵字的屬性,setter方法會呼叫copywithzone:方法,生成物件的副本,可是如果是可變物件,是用來copy關鍵字,那麼它的副本就是不可變的,也就無法呼叫修改物件的方法。

例如nsmutablearray使用了copy關鍵字修飾,它就無法呼叫addobject等方法,會報出無法找到選擇子的錯誤。

屬性關鍵字

從源**理解atomic為什麼執行緒不安全

IOS 屬性關鍵字

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

iOS屬性關鍵字

常用的屬性關鍵字 assign,weak,unsafe unretained,strong,retain copy,readonly,readwrite nonatomic,natomic及 weak,block synthesize 和 dynamic,只有準確的理解了他們的原理,用起來才能得心應...

iOS 宣告屬性關鍵字講解

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