1,assign :安全
簡單賦值,不更改索引計數多線程
假設你用malloc分配了一塊內存,而且把它的地址賦值給了指針a,後來你但願指針b也共享這塊內存,因而你又把a賦值給(assign)了b。此時a 和b指向同一塊內存,請問當a再也不須要這塊內存,可否直接釋放它?答案是否認的,由於a並不知道b是否還在使用這塊內存,若是a釋放了,那麼b在使用這塊內存的時候會引發程序crash掉
應用場合:函數
對基礎數據類型 (例如NSInteger,CGFloat)和C數據類型(int, float, double, char, 等) ui
適用簡單數據類型atom
2,retain:spa
與strong相對應,使用了引用計數,retain+1,release -1;當引用 計數爲0時,dealloc會被調用,內存被釋放
3,copy:線程
用於非共享內存時,每一個指針有本身的內存空間
4,atomic//默認屬性指針
A,當一個變量聲明爲atomic時,意味着在多線程中只能有一個線程能對它進行訪問 B,當一個變量聲明爲atomic時,該變量爲線程安全型,可是會影響訪問速度, C,當一個變量聲明爲atomic時,在非ARC編譯環境下,須要設置訪問鎖來保證對該變量進行正確的get/set
5,nonatomiccode
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