@property 是一種支持訪問對象成員變更的快捷方法捐川,可以自動(dòng)生成setter和getter方法。
面向?qū)ο笏枷氲幕咎攸c(diǎn)為封裝奋姿、繼承锄开、多態(tài)。封裝性主要體現(xiàn)在無法直接訪問對象成員變量胀蛮,如果需要的話院刁,通過setter和getter方法訪問成員變量糯钙。這樣的話粪狼,通常要為每一個(gè)支持外邊訪問的成員變量寫兩個(gè)方法退腥,這種操作比較繁瑣且無意義。通過@property可以簡化這種方法再榄。
@property的修飾屬性(attributes?)
可讀性:readwrite / readonly 狡刘,不寫的話默認(rèn)為readwrite,即會(huì)合成setter和getter方法困鸥。
原子性:nonatomic / 【默認(rèn)】嗅蔬,系統(tǒng)默認(rèn)setter和getter為原子操作(沒有atomic關(guān)鍵字),如果想設(shè)置為非原子操作疾就,可以nonatomic澜术。
4,atomic//默認(rèn)屬性
A猬腰,當(dāng)一個(gè)變量聲明為atomic時(shí)鸟废,意味著在多線程中只能有一個(gè)線程能對它進(jìn)行訪問
B,當(dāng)一個(gè)變量聲明為atomic時(shí)姑荷,該變量為線程安全型盒延,但是會(huì)影響訪問速度,
C鼠冕,當(dāng)一個(gè)變量聲明為atomic時(shí)添寺,在非ARC編譯環(huán)境下,需要設(shè)置訪問鎖來保證對該變量
進(jìn)行正確的get/set
特點(diǎn) : 單寫多讀
atomic 屬性的setter里面里面有一把鎖,叫做自旋鎖
atomic :| 0:0 | 1:0 | | -- | -- | | 0:2 | 1:2 | 線程安全,需要消耗大量的資源.性能比非原子屬性要差一點(diǎn)兒點(diǎn)兒.
自旋鎖:如果發(fā)現(xiàn)有其他線程正在執(zhí)行鎖定的代碼,線程會(huì)以死循環(huán)的方式,一直等待鎖定代碼執(zhí)行完成.
nonatomic
A懈费,? ? 當(dāng)一個(gè)變量聲明為nonatomic時(shí)计露,意味著多個(gè)線程可以同時(shí)對其進(jìn)行訪問
B,? ? 當(dāng)一個(gè)變量聲明為nonatomic時(shí)憎乙,它是非線程安全型薄坏,訪問速度快;
C寨闹,? ? 當(dāng)一個(gè)變量聲明為nonatomic時(shí)胶坠,當(dāng)兩個(gè)不同的線程對其訪問時(shí),容易失控繁堡。
atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作碰酝。在多線程環(huán)境下,原子操作是必要的织盼,否則有可能引起錯(cuò)誤的結(jié)果
nonatomic : 非線程安全,適合內(nèi)存小的移動(dòng)設(shè)備.
互斥鎖:如果發(fā)現(xiàn)有其他線程正在執(zhí)行鎖定的代碼,線程會(huì)進(jìn)入休眠狀態(tài),等待其他線程執(zhí)行完畢,打開鎖之后,線程會(huì)重新進(jìn)入就緒狀態(tài).等待被CPU重新調(diào)度.
? 所有屬性都聲明為nonatomic,原子屬性和非原子屬性的性能幾乎一樣.
? 盡量避免多線程搶奪同一塊資源.
? 要實(shí)現(xiàn)線程安全,必須要用到鎖.無論什么鎖,都是有性能消耗的.
? 自旋鎖更適合執(zhí)行非常短的代碼.死循環(huán)內(nèi)部不適合寫復(fù)雜的代碼.
? 盡量將加鎖,資源搶奪的業(yè)務(wù)邏輯交給服務(wù)器端處理,減小移動(dòng)客戶端的壓力.
? 為了流暢的用戶體驗(yàn),UIKit類庫的線程都是不安全的,所以我們需要在主線程(UI線程)上更新UI.
? 所有包含NSMutable的類都是線程不安全的.在做多線程開發(fā)的時(shí)候,需要注意多線程同時(shí)操作可變對象的線程安全問題.
內(nèi)存 assign / retain / weak / strong 妄田,在非ARC環(huán)境下, assign為默認(rèn)绳矩,引用計(jì)數(shù)不變罩润;retain引用計(jì)數(shù)加1;在引用計(jì)數(shù)環(huán)境下翼馆,默認(rèn)為strong割以,與retain作用相同金度;從5.0系統(tǒng)后引入了weak,作用與assign相似严沥,不過當(dāng)所指向?qū)ο笠脼?時(shí)猜极,自動(dòng)置為nil。
copy:MRC下先release舊值消玄,再copy新值跟伏,copy的本質(zhì)為復(fù)制該內(nèi)存所存儲(chǔ)的內(nèi)容,重新創(chuàng)建一個(gè)對象賦給其相同的內(nèi)容翩瓜,很明顯受扳,在copy這個(gè)過程中也發(fā)生了一次retain,不過這是個(gè)全新的對象兔跌。在上例中辞色,_str與str最終指向了不同的內(nèi)存區(qū)域,但其內(nèi)容一樣浮定。
copy一般適用于NSString等不可變的對象相满,因?yàn)槭侵匦聞?chuàng)建了對象,并且內(nèi)容不變桦卒,因此不用擔(dān)心后面的操作會(huì)對該屬性的值產(chǎn)生影響立美。