@property后面有哪些修飾符

@property后面有哪些修飾符

1.線程安全的

atomic、nonatomic

2.訪問權(quán)限的

readonly、readwrite

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

  assign、strong、weak、copy

4.內(nèi)存管理(MRC)

assign、retain、release

5.指定方法名稱

setter = 
getter =

詳解

一、線程安全的

多線程存在安全隱患

1.一塊資源可能會(huì)被多個(gè)線程共享,也就是多個(gè)線程可能同時(shí)訪問同一資源,如:
多線程訪問同一個(gè)對(duì)象,同一個(gè)變量,同一個(gè)文件
2.當(dāng)多線程訪問同一塊資源的時(shí)候,很容易引發(fā)數(shù)據(jù)錯(cuò)亂和數(shù)據(jù)安全問題

原子性 和非原子性

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

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

1.atomic原子性指的是一個(gè)操作不可以被CPU中途暫停,然后再調(diào)度。即不能被中斷,要么就執(zhí)行完,要么就不執(zhí)行
2.atomic是自旋鎖,當(dāng)上一線程沒有執(zhí)行完畢的時(shí)候(被鎖?。?,下一個(gè)線程會(huì)一直等待(不會(huì)進(jìn)入睡眠狀態(tài)),當(dāng)上衣線程任務(wù)執(zhí)行完畢,下一線程立即執(zhí)行。它區(qū)別于互斥鎖,互斥鎖在等待的時(shí)候,會(huì)進(jìn)入睡眠狀態(tài),當(dāng)被上一線程執(zhí)行完畢后,會(huì)被喚醒,然后再執(zhí)行。
3.atomic只給setter方法上鎖,getter不會(huì)加鎖
4.atomic需要消耗大量的資源,執(zhí)行效率低

非原子性

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

二、訪問權(quán)限

readwrite  默認(rèn)  擁有g(shù)etter/setter方法  可讀可寫
readonly  只讀屬性, 只會(huì)生成getter方法,不會(huì)生成setter方法

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

1.assign 默認(rèn)

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

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

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

3.weak

弱引用,只是單純引用某個(gè)對(duì)象,但是并未擁有該對(duì)象
即一個(gè)對(duì)象被持有無(wú)數(shù)個(gè)弱引用,只要沒有強(qiáng)引用指向它,那么它就會(huì)被清除釋放

4.copy

為減少對(duì)上下文的依賴而引入的機(jī)制,可以理解為內(nèi)容的拷貝
內(nèi)容被拷貝后,內(nèi)存中會(huì)有兩個(gè)存儲(chǔ)空間存儲(chǔ)相同的內(nèi)容。指針不是同一個(gè)地址

UI控件使用weak的原因:

UI控件之所以可以使用弱指針,是因?yàn)榭刂破饔袕?qiáng)指針指向UIView  
UIView 有強(qiáng)指針指向Subviews數(shù)組,數(shù)組中由強(qiáng)指針指向控件
W~O{_ZN3VHY17I{9V9H`P15.jpg
代理必須是weak,因?yàn)榇硪话愣际侵赶蚩刂破?,?huì)造成循環(huán)引用,無(wú)法釋放,造成內(nèi)存泄露

關(guān)于weak 與assign

在ARC,出現(xiàn)循環(huán)引用的時(shí)候,必須有一端使用weak
weak修飾的對(duì)象銷毀的時(shí)候,指針會(huì)自動(dòng)設(shè)置為nil
而assign不會(huì),assign可以用于非OC對(duì)象,而weak必須用于OC對(duì)象

關(guān)于copy與strong

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

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

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

1.基本數(shù)據(jù)類型:atomic    readwrite    assign
2.普通OC對(duì)象:   atomic    readwrite    strong

關(guān)于@property的作用

使用@property,編譯器會(huì)自動(dòng)為我們添加getter和setter方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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