@property淺析

在作iOS以後的一段時間都是在用,也沒深刻了解過某些底層具體的東西,在閒時看到了@property的深層次的性質,如今分享出來多線程

@property有三個部分佈局

一、strong\weak\copy\assignatom

二、nonatomic\atomicspa

三、readonly\readwrite.net

通常是前兩個,最後一個是默認的屬性線程

readonly和readwrite

readonly只有setter方法、readwrite同時有getter和setter方法,setter爲建立時候所調用的方法,只有在使用self.的時候纔會調用指針

nonatomic\atomic

atomic保證了原子性,即保證了setter和getter的原語性,這個爲默認的狀況,爲了保證在多線程的狀況下,編譯器會自動生成互斥加鎖的代碼,保證同步code

nonatomic不考慮多線程的狀況,不考慮互斥加鎖狀況,提升效率對象

通常狀況下咱們是不須要多線程的,用nonatomic便可索引

用了atomic就是多線程中只有一個線程能夠訪問該屬性,不然爲nonatomic的話多個線程可同時訪問該屬性。

strong\weak\copy\assign

這一塊是比較重要的

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;
}

弱指針Weak:

在使用 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 方法

相關文章
相關標籤/搜索