屬性是objective c 的一項(xiàng)特性瘸羡,用于封裝對(duì)象中的數(shù)據(jù)漩仙。實(shí)例一般通過(guò)“存取方法”來(lái)訪問(wèn)。什么是存取方法:getter 和setter 方法犹赖,其中g(shù)etter 用于獲取變量value队他, 而setter 用于寫(xiě)入value。在objective c 2.0中冷尉,可以通過(guò)“點(diǎn)語(yǔ)法” 來(lái)讓編譯器自動(dòng)調(diào)用相關(guān)的存取方法漱挎。?
例如:Student * student=[[Student alloc]init];
? ? ? ? ??student.name="xxxxx";
? ? ? ? ? nslog(@"%s",student.name);
編譯器會(huì)把點(diǎn)語(yǔ)法轉(zhuǎn)換成存取方法的調(diào)用。
那么點(diǎn)語(yǔ)法和手寫(xiě)get set 方法效果是一樣的雀哨,點(diǎn)語(yǔ)法有什么優(yōu)勢(shì)呢磕谅?
? ? ? ?1.省時(shí),省力 :如果使用了屬性雾棺,編譯器會(huì)自動(dòng)編寫(xiě)訪問(wèn)屬性所需的方法膊夹。這個(gè)過(guò)程由編譯器在編譯期執(zhí)行,看不到這些get set 源代碼捌浩。
? ? ? ? 2.編譯器會(huì)自動(dòng)向類(lèi)中添加適當(dāng)類(lèi)型的實(shí)例變量放刨,并且在屬性名前添加下劃線。
如果不想讓編譯器自動(dòng)合成存取方法尸饺,該如何做呢进统?
? ? ? ? ? 使用@dynamic 關(guān)鍵字? ? ? ?
屬性特質(zhì)
? ? ? ? ?1.原子性
? ? ? ? ? ? ? ? ? 默認(rèn)情況下,編譯器所合成的方法會(huì)通過(guò)鎖定機(jī)制保證其原子性浪听。如果屬性具備nonatomic 特質(zhì)螟碎,則不使用同步鎖。如果某屬性不具備nonatomic 特質(zhì)迹栓, 那么就是原子的掉分。
? ? ? ? ? ? ? ? ? 內(nèi)存管理??
? ? ? ? ? ? ? ? ? ? ?1)assign :”設(shè)置方法“? 只會(huì)執(zhí)行正對(duì) “純量類(lèi)型”? ?如:CGFloat 和NSInteger 簡(jiǎn)單的操作
? ? ? ? ? ? ? ? ? ? ?2)strong : 此特質(zhì)表明該屬性定義了一種“擁有關(guān)系”? 。
? ? ? ? ? ? ? ? ? ? ?3)weak :定義了一種非擁有關(guān)系, 該屬性所指的對(duì)象遭到摧毀酥郭, 屬性value 也會(huì)被清空华坦。
? ? ? ? ? ? ? ? ? ? ?4)unsafe_unretained: 和assign 相同,適用于對(duì)象類(lèi)型不从,當(dāng)目標(biāo)對(duì)象遭到破壞時(shí)惜姐,屬性vlaue? 不會(huì)自動(dòng)被清空。
atomic和nonatomic 的區(qū)別是什么消返?
? ? ? ? ? ?具備atomic特質(zhì)的獲取方法會(huì)通過(guò)鎖定機(jī)制來(lái)確保其操作的原子性载弄。也就是說(shuō),如果兩個(gè)線程讀寫(xiě)同一屬性撵颊,那么不論何時(shí),總能看到有效的屬性value惫叛,? 如果不加鎖的話倡勇,或者使用(nonatomic),那么當(dāng)其中一個(gè)線程正在修改某屬性時(shí),另一個(gè)線程或許會(huì)突然闖入嘉涌,把尚未修改好的屬性讀取出來(lái)妻熊。
但是如果ios 全部采用原子的話,在ios中會(huì)開(kāi)銷(xiāo)很大仑最,會(huì)帶來(lái)性能問(wèn)題扔役,而且使用原子并不能保證線程安全。例如警医,一個(gè)線程在連續(xù)多次讀取某屬性的過(guò)程中有別的線程在同時(shí)改寫(xiě)該值亿胸,即便申明為atomic,還是會(huì)讀取到不同的屬性
? ? ? ? ? ? ? ??