Objective-C中@property的所有屬性詳解
阿新 • • 發佈:2019-01-08
1,assign :
簡單賦值,不更改索引計數
假設你用malloc分配了一塊記憶體,並且把它的地址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給(assign)了b。此時a 和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這塊記憶體的時候會引起程式crash掉
應用場合:
對基礎資料型別 (例如NSInteger,CGFloat)和C資料型別(int, float, double, char, 等)
適用簡單資料型別
2,retain:
與strong相對應,使用了引用計數,retain+1,release -1;當引用 計數為0時,dealloc會被呼叫,記憶體被釋放
3,copy:
用於非共享記憶體時,每個指標有自己的記憶體空間
4,atomic//預設屬性
A,當一個變數宣告為atomic時,意味著在多執行緒中只能有一個執行緒能對它進行訪問
B,當一個變數宣告為atomic時,該變數為執行緒安全型,但是會影響訪問速度,
C,當一個變數宣告為atomic時,在非ARC編譯環境下,需要設定訪問鎖來保證對該變數進行正確的get/set
5,nonatomic
A, 當一個變數宣告為nonatomic時,意味著多個執行緒可以同時對其進行訪問
B, 當一個變數宣告為nonatomic時,它是非執行緒安全型,訪問速度快;
C, 當一個變數宣告為nonatomic時,當兩個不同的執行緒對其訪問時,容易失控。
總結:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多執行緒環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函式會變成下面這樣:
if (property != newValue) {
[property release];
property = [newValue retain];
}
6.strong://ARC中預設屬性,等於非ARC中的retain
與retain相對應,
應用場景:
strong屬性用於ARC中
@property (strong,nonatomic) ViewController *viewController;
7,weak:
與assign 相對應,
應用場景:
用於IBOutlets,如,UIViewController的子類,即一般的控制元件。
@property (weak, nonatomic) IBOutlet UIButton *myButton;
strong與weak的區別舉例:
前提:
我們把要用strong或者weak的物件比作一隻風箏,風箏想掙脫線的束縛,自由飛翔去,如果此時有一根線,那麼這隻風箏就掙脫不了
過程分析
strong屬性的變數:
當我們把指向一隻風箏的變數宣告為strong時,此時,你就擁有控制這隻風箏的線,假如此時有五個人同時控制這隻風箏(即這隻風箏物件有三個strong型別的變數指向它),那麼只有一種情況,這隻風箏才會掙脫掉線的束縛:這三個人都放掉手中的線,(release掉)
weak屬性的變數:
當我們把指向一隻風箏的變數宣告為weak時,此時,就像站在旁邊看風箏的觀眾們一樣,當上面的三個人還握著手中的線時,他們只能看到風箏,並不能控制它,他們能做的只能是用手指指向風箏,並大喊,“看,那隻風箏飛得真高!”,然而,當上面的三個人把手中的線都放掉時,此時,風箏飛走了,看不見了,不管有再多的觀眾,他們再也看不到風箏了,這個故事告訴我們一個道理:當strong型別的指標被釋放掉之後,所有的指向同一個物件的weak指標都會被清零。
8,readonly
只有get方法,沒有set方法
9,readwrite//預設屬性
有get/set方法
10,unsafe_unretauined
用在ARC編譯環境下,在此環境下,與assign相似。它只是告訴ARC如何正確地呼叫宣告為unsafe_unretauined變數的retain和release
簡單賦值,不更改索引計數
假設你用malloc分配了一塊記憶體,並且把它的地址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給(assign)了b。此時a 和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這塊記憶體的時候會引起程式crash掉
應用場合:
對基礎資料型別 (例如NSInteger,CGFloat)和C資料型別(int, float, double, char, 等)
適用簡單資料型別
2,retain:
與strong相對應,使用了引用計數,retain+1,release -1;當引用 計數為0時,dealloc會被呼叫,記憶體被釋放
3,copy:
用於非共享記憶體時,每個指標有自己的記憶體空間
4,atomic//預設屬性
A,當一個變數宣告為atomic時,意味著在多執行緒中只能有一個執行緒能對它進行訪問
B,當一個變數宣告為atomic時,該變數為執行緒安全型,但是會影響訪問速度,
C,當一個變數宣告為atomic時,在非ARC編譯環境下,需要設定訪問鎖來保證對該變數進行正確的get/set
5,nonatomic
A, 當一個變數宣告為nonatomic時,意味著多個執行緒可以同時對其進行訪問
B, 當一個變數宣告為nonatomic時,它是非執行緒安全型,訪問速度快;
C, 當一個變數宣告為nonatomic時,當兩個不同的執行緒對其訪問時,容易失控。
總結:atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多執行緒環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函式會變成下面這樣:
if (property != newValue) {
[property release];
property = [newValue retain];
}
6.strong://ARC中預設屬性,等於非ARC中的retain
與retain相對應,
應用場景:
strong屬性用於ARC中
@property (strong,nonatomic) ViewController *viewController;
7,weak:
與assign 相對應,
應用場景:
用於IBOutlets,如,UIViewController的子類,即一般的控制元件。
@property (weak, nonatomic) IBOutlet UIButton *myButton;
strong與weak的區別舉例:
前提:
我們把要用strong或者weak的物件比作一隻風箏,風箏想掙脫線的束縛,自由飛翔去,如果此時有一根線,那麼這隻風箏就掙脫不了
過程分析
strong屬性的變數:
當我們把指向一隻風箏的變數宣告為strong時,此時,你就擁有控制這隻風箏的線,假如此時有五個人同時控制這隻風箏(即這隻風箏物件有三個strong型別的變數指向它),那麼只有一種情況,這隻風箏才會掙脫掉線的束縛:這三個人都放掉手中的線,(release掉)
weak屬性的變數:
當我們把指向一隻風箏的變數宣告為weak時,此時,就像站在旁邊看風箏的觀眾們一樣,當上面的三個人還握著手中的線時,他們只能看到風箏,並不能控制它,他們能做的只能是用手指指向風箏,並大喊,“看,那隻風箏飛得真高!”,然而,當上面的三個人把手中的線都放掉時,此時,風箏飛走了,看不見了,不管有再多的觀眾,他們再也看不到風箏了,這個故事告訴我們一個道理:當strong型別的指標被釋放掉之後,所有的指向同一個物件的weak指標都會被清零。
8,readonly
只有get方法,沒有set方法
9,readwrite//預設屬性
有get/set方法
10,unsafe_unretauined
用在ARC編譯環境下,在此環境下,與assign相似。它只是告訴ARC如何正確地呼叫宣告為unsafe_unretauined變數的retain和release