關(guān)于Objective-C的 @property認(rèn)識整理-

最近項目不忙,閑下來回顧開發(fā)過程,發(fā)現(xiàn)自己雖然開發(fā)幾年了,對iOS的一些基礎(chǔ)理解不是很深刻,用的時候也只是停留在用的階層。是時候梳理一番自己的模糊知識點和認(rèn)知。

一、@property是什么

@Property是聲明屬性的語法,它可以快速方便的為實例變量創(chuàng)建存取器,并允許我們通過點語法使用存取器。

存取器(accessor):指用于獲取和設(shè)置實例變量的方法。用于獲取實例變量值的存取器是getter,用于設(shè)置實例變量值的存取器是setter。

二、@property后面有哪些修飾

1.線程安全的

atomic、nonatomic

atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。

atomic

設(shè)置成員變量的@property屬性時,默認(rèn)為atomic,提供多線程安全。

在多線程環(huán)境下,原子操作是必要的,否則有可能引起錯誤的結(jié)果。加了atomic,setter函數(shù)會變成下面這樣:

{lock}

if (property != newValue) {

[property release];

property = [newValue retain];

}

{unlock}

nonatomic

禁止多線程,變量保護(hù),提高性能。

atomic是Objc使用的一種線程保護(hù)技術(shù),基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤。而這種機(jī)制是耗費系統(tǒng)資源的,所以在iPhone這種小型設(shè)備上,如果沒有使用多線程間的通訊編程,那么nonatomic是一個非常好的選擇。

指出訪問器不是原子操作,而默認(rèn)地,訪問器是原子操作。這也就是說,在多線程環(huán)境下,解析的訪問器提供一個對屬性的安全訪問,從獲取器得到的返回值或者通過設(shè)置器設(shè)置的值可以一次完成,即便是別的線程也正在對其進(jìn)行訪問。如果你不指定 nonatomic ,在自己管理內(nèi)存的環(huán)境中,解析的訪問器保留并自動釋放返回的值,如果指定了 nonatomic ,那么訪問器只是簡單地返回這個值。

//

1.2.多線程存在安全隱患

(1).一塊資源可能會被多個線程共享,也就是多個線程可能同時訪問同一資源,如:

多線程訪問同一個對象,同一個變量,同一個文件

(2).當(dāng)多線程訪問同一塊資源的時候,很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全問題

原子性和非原子性

atomic -----原子性---- 默認(rèn)

nonatomic ----非原子性

原子性 :默認(rèn)

這個屬性是為了保證程序在多線程下,編譯器會自動生成自旋鎖代碼,避免該變量的讀寫不同步問題,提供多線程安全,即多線程中只能有一個線程對它進(jìn)行訪問。

注意:

(1).atomic原子性指的是一個操作不可以被CPU中途暫停,然后再調(diào)度。即不能被中斷,要么就執(zhí)行完,要么就不執(zhí)行

(2).atomic是自旋鎖,當(dāng)上一線程沒有執(zhí)行完畢的時候(被鎖?。?,下一個線程會一直等待(不會進(jìn)入睡眠狀態(tài)),當(dāng)上衣線程任務(wù)執(zhí)行完畢,下一線程立即執(zhí)行。它區(qū)別于互斥鎖,互斥鎖在等待的時候,會進(jìn)入睡眠狀態(tài),當(dāng)被上一線程執(zhí)行完畢后,會被喚醒,然后再執(zhí)行。

(3).atomic只給setter方法上鎖,getter不會加鎖

(4).atomic需要消耗大量的資源,執(zhí)行效率低

非原子性

nonatomic:非原子性,非線程安全,多個線程可以同時對其進(jìn)行訪問,使用該屬性編譯器會少生成加鎖代碼,提高性能和效率,使用頻率高,一般都是放棄安全,提高性能

2.訪問權(quán)限

readwrite? 默認(rèn)? 擁有g(shù)etter/setter方法? 可讀可寫

readonly? 只讀屬性, 只會生成getter方法,不會生成setter方法

3、內(nèi)存管理(ARC)

1.assign? 默認(rèn)

適用于基本數(shù)據(jù)類型:NSInteger、CGFloat和C數(shù)據(jù)類型 int、float等

2.strong? 對應(yīng)MRC中的retain

強(qiáng)引用,只有OC對象才能夠使用該屬性,它使對象的引用計數(shù)加1

3.weak

弱引用,只是單純引用某個對象,但是并未擁有該對象

即一個對象被持有無數(shù)個弱引用,只要沒有強(qiáng)引用指向它,那么它就會被清除釋放

4.copy

為減少對上下文的依賴而引入的機(jī)制,可以理解為內(nèi)容的拷貝

內(nèi)容被拷貝后,內(nèi)存中會有兩個存儲空間存儲相同的內(nèi)容。指針不是同一個地址

UI控件使用weak的原因:

UI控件之所以可以使用弱指針,是因為控制器有強(qiáng)指針指向UIView

UIView 有強(qiáng)指針指向Subviews數(shù)組,數(shù)組中由強(qiáng)指針指向控件


代理必須是weak,因為代理一般都是指向控制器,會造成循環(huán)引用,無法釋放,造成內(nèi)存泄露

關(guān)于weak 與assign

在ARC,出現(xiàn)循環(huán)引用的時候,必須有一端使用weak

weak修飾的對象銷毀的時候,指針會自動設(shè)置為nil

而assign不會,assign可以用于非OC對象,而weak必須用于OC對象

關(guān)于copy與strong

NSString、NSArray、NSDictionary常用copy,為什么不用strong?

strong是強(qiáng)引用,指向的是同一個內(nèi)存地址,copy是內(nèi)容拷貝,會另外開辟內(nèi)存空間,指針指向一個不同的內(nèi)存地址,copy返回的是一個不可變對象,如果使用strong修飾可變對象,那么對象就會有可能被不經(jīng)意間修改,有時不是我們想要的,而copy不會發(fā)生這種意外。

關(guān)于ARC下,不顯示指定屬性關(guān)鍵字時,默認(rèn)關(guān)鍵字有哪些?

1.基本數(shù)據(jù)類型:atomic? ? readwrite? ? assign

2.普通OC對象:? atomic? ? readwrite? ? strong

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 內(nèi)存管理是程序在運行時分配內(nèi)存、使用內(nèi)存,并在程序完成時釋放內(nèi)存的過程。在Objective-C中,也被看作是在眾...
    蹲瓜閱讀 3,390評論 1 8
  • 文/甌南 ◇再次被發(fā)現(xiàn) 自那次秦偵察兵被趙軍發(fā)現(xiàn)后,趙軍就加強(qiáng)了防御和巡邏。他們把巡邏的范圍擴(kuò)大到了上次抓住秦軍的...
    甌南閱讀 614評論 0 7
  • 一個助人為樂, 常替他人著想的人, 即使在最困難的時侯, 仍舊愿意幫助別人, 依然替別人考慮, 我看到了一束光, ...
    Angel李子汐閱讀 560評論 10 19
  • 去美區(qū)商店可以下載 Oxford Dictionary of English FREE by MobiSystem...
    鴨梨山大哎閱讀 373評論 0 1
  • 關(guān)鍵詞:路易威登酩悅軒尼詩 冒泡香檳酒 奢侈品價格曲線 工匠精神 精確 經(jīng)驗、技術(shù)和藝...
    幾0一閱讀 399評論 0 1

友情鏈接更多精彩內(nèi)容