在作iOS以後的一段時間都是在用,也沒深刻了解過某些底層具體的東西,在閒時看到了@property的深層次的性質,如今分享出來多線程
@property有三個部分佈局
一、strong\weak\copy\assignatom
二、nonatomic\atomicspa
三、readonly\readwrite.net
通常是前兩個,最後一個是默認的屬性線程
readonly只有setter方法、readwrite同時有getter和setter方法,setter爲建立時候所調用的方法,只有在使用self.的時候纔會調用指針
atomic保證了原子性,即保證了setter和getter的原語性,這個爲默認的狀況,爲了保證在多線程的狀況下,編譯器會自動生成互斥加鎖的代碼,保證同步code
nonatomic不考慮多線程的狀況,不考慮互斥加鎖狀況,提升效率對象
通常狀況下咱們是不須要多線程的,用nonatomic便可索引
用了atomic就是多線程中只有一個線程能夠訪問該屬性,不然爲nonatomic的話多個線程可同時訪問該屬性。
這一塊是比較重要的
strong強指針,其修飾的屬性通常不會自動釋放(控制器銷燬後自動釋放)OC中,對象默認是強指針,在實際開放中通常屬性對象通常用strong來修飾(NSArray,NSDictionary),在使用懶加載定義控件的時候,通常也用strong
eg:
@property (nonatomic, strong) NSArray *dataList;
@property (nonatomic, strong) UILabel *label;
懶加載控件 - (UILabel *)label { if (_label == nil) { _label = [[UILabel alloc] init]; } return _label; }
在使用 sb 或者 xib 給控件拖線的時候,屬性都是用 weak 修飾,再向XIB或者sb裏面添加控件時,添加的子視圖是添加到跟視圖View上,控制器對其跟視圖View默認是強引用,當咱們的子控件添加到 view 上面的時候, self.view addSubView: 這個方法會對添加的控件進行強引用,若是在用 strong 對添加的子控件進行修飾的話,至關於有兩條強指針對子控件進行強引用,爲了不這種狀況,因此用 weak 修飾。
addSubView 默認對其 subView 進行了強引用,在純手碼實現界面佈局時,若是經過懶加載處理界面控件,須要使用strong強指針
assign:
是用來修飾基本數據類型,只是簡單賦值,不更改索引計數(Reference Counting)針對基礎數據類型 (NSInteger,CGFloat)和C數據類型(int, float, double, char, 等等)
copy:
copy分爲深拷貝和淺拷貝和copy ,mutableCopy
淺拷貝和深拷貝都是說引用數據類型,不是說基本數據類型, 淺拷貝是說在給一個變量賦值的是將另外一個變量的引用(內存地址)賦值給新變量,而不是又從新造了一個新的東西來,深拷貝是將從新制造出一個變量的副本,而後將變量的副本賦值給新變量,
淺拷貝:指針拷貝,不產生新的對象,源對象的引用計數器+1;
深拷貝:對象拷貝,會產生新的對象,源對象的引用計數器不變;
copy:拷貝的結果是一個不可變(imutable)的對象, 不管源對象是可變的仍是不可變的,copy以後的都是不可變的類型
不可變類型 變量名 = [不可變類型|可變類型 copy];
mutableCopy:可變拷貝的結果的數據類型是一個可變的對象,不管源對象時不可變的仍是可變的,可變拷貝以後的數據類型都是可變類型
可變類型 變量名 = [不可變類型|可變類型 mutableCopy];
本質上@property (nonatomic, strong) UILabel * previousPriceLabel;
至關於聲明UILabel * previousPriceLabe;而且實現setter 和getter 方法