@property后面有哪些修飾符

@property后面有哪些修飾符

1.線程安全的

atomic、nonatomic

2.訪問權限的

readonly、readwrite

3.內存管理(ARC)

  assign、strong、weak、copy

4.內存管理(MRC)

assign、retain、release

5.指定方法名稱

setter = 
getter =

詳解

一、線程安全的

多線程存在安全隱患

1.一塊資源可能會被多個線程共享,也就是多個線程可能同時訪問同一資源,如:
多線程訪問同一個對象,同一個變量,同一個文件
2.當多線程訪問同一塊資源的時候,很容易引發數據錯亂和數據安全問題

原子性 和非原子性

atomic -----原子性---- 默認
nonatomic ----非原子性

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

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

非原子性

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

二、訪問權限

readwrite  默認  擁有getter/setter方法  可讀可寫
readonly  只讀屬性, 只會生成getter方法,不會生成setter方法

三、內存管理(ARC)

1.assign 默認

  適用于基本數據類型:NSInteger、CGFloat和C數據類型 int、float等

2.strong 對應MRC中的retain

強引用,只有OC對象才能夠使用該屬性,它使對象的引用計數加1

3.weak

弱引用,只是單純引用某個對象,但是并未擁有該對象
即一個對象被持有無數個弱引用,只要沒有強引用指向它,那么它就會被清除釋放

4.copy

為減少對上下文的依賴而引入的機制,可以理解為內容的拷貝
內容被拷貝后,內存中會有兩個存儲空間存儲相同的內容。指針不是同一個地址

UI控件使用weak的原因:

UI控件之所以可以使用弱指針,是因為控制器有強指針指向UIView  
UIView 有強指針指向Subviews數組,數組中由強指針指向控件
W~O{_ZN3VHY17I{9V9H`P15.jpg
代理必須是weak,因為代理一般都是指向控制器,會造成循環引用,無法釋放,造成內存泄露

關于weak 與assign

在ARC,出現循環引用的時候,必須有一端使用weak
weak修飾的對象銷毀的時候,指針會自動設置為nil
而assign不會,assign可以用于非OC對象,而weak必須用于OC對象

關于copy與strong

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

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

關于ARC下,不顯示指定屬性關鍵字時,默認關鍵字有哪些?

1.基本數據類型:atomic    readwrite    assign
2.普通OC對象:   atomic    readwrite    strong

關于@property的作用

使用@property,編譯器會自動為我們添加getter和setter方法
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容