Objective-C中@property的所有屬性詳解

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 內存管理是程序在運行時分配內存、使用內存,并在程序完成時釋放內存的過程。在Objective-C中,也被看作是在眾...
    蹲瓜閱讀 3,180評論 1 8
  • assign:簡單賦值,不更改引用計數---基礎數據類型(NSInteger,CGFloat,int, float...
    丘山Ivan閱讀 2,113評論 0 4
  • 先以一圖總結: 以下:「attribute(s)」,「特性」是指同一事物(都指@property后面括號內的單詞)...
    AntonyWong閱讀 13,692評論 9 47
  • __block和__weak修飾符的區別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,363評論 0 6
  • 一 像十六十七歲那樣花樣的年紀,少女的心里總是藏著那么一個人,或是因為籃球場上帥氣的姿勢,或是在飯堂抬頭偶遇帥氣的...
    梁九九噢閱讀 337評論 0 2