@property後面有哪些修飾符
1.線程安全的
atomic、nonatomic
2.訪問權限的
readonly、readwrite
3.內存管理(ARC)
assign、strong、weak、copy
4.內存管理(MRC)
assign、retain、release
5.指定方法名稱
setter =
getter =
詳解
1、線程安全的
多線程存在安全隱患
1.一塊資源可能會被多個線程共享,也就是多個線程可能同時訪問同一資源,如:
多線程訪問同一個對象,同一個變量,同一個文件
2.當多線程訪問同一塊資源的時候,很容易引起數據錯亂和數據安全問題
原子性和非原子性
atomic -----原子性---- 默認
nonatomic ----非原子性
原子性 :默認
這個屬性是爲了保證程序在多線程下,編譯器會自動生成自旋鎖代碼,避免該變量的讀寫不一樣步問題,提供多線程安全,即多線程中只能有一個線程對它進行訪問。
注意:
1.atomic原子性指的是一個操做不能夠被CPU中途暫停,而後再調度。即不能被中斷,要麼就執行完,要麼就不執行
2.atomic是自旋鎖,當上一線程沒有執行完畢的時候(被鎖住),下一個線程會一直等待(不會進入睡眠狀態),當上衣線程任務執行完畢,下一線程當即執行。它區別於互斥鎖,互斥鎖在等待的時候,會進入睡眠狀態,當被上一線程執行完畢後,會被喚醒,而後再執行。
3.atomic只給setter方法上鎖,getter不會加鎖
4.atomic須要消耗大量的資源,執行效率低
非原子性
nonatomic:非原子性,非線程安全,多個線程能夠同時對其進行訪問,使用該屬性編譯器會少生成加鎖代碼,提升性能和效率,使用頻率高,通常都是放棄安全,提升性能
2、訪問權限
readwrite 默認 擁有getter/setter方法 可讀可寫
readonly 只讀屬性, 只會生成getter方法,不會生成setter方法
3、內存管理(ARC)
1.assign 默認
適用於基本數據類型:NSInteger、CGFloat和C數據類型 int、float等
2.strong 對應MRC中的retain
強引用,只有OC對象纔可以使用該屬性,它使對象的引用計數加1
3.weak
弱引用,只是單純引用某個對象,可是並未擁有該對象
即一個對象被持有無數個弱引用,只要沒有強引用指向它,那麼它就會被清除釋放
4.copy
爲減小對上下文的依賴而引入的機制,能夠理解爲內容的拷貝
內容被拷貝後,內存中會有兩個存儲空間存儲相同的內容。指針不是同一個地址
UI控件使用weak的緣由:
UI控件之因此可使用弱指針,是由於控制器有強指針指向UIView
UIView 有強指針指向Subviews數組,數組中由強指針指向控件
代理必須是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方法
文/萬里_飛哥(簡書做者)
原文連接:http://www.jianshu.com/p/da797678ef95
著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。數組