1. 程式人生 > >iOS 開發 property,strong,weak,retain,assign,copy,nomatic 的區別及使用

iOS 開發 property,strong,weak,retain,assign,copy,nomatic 的區別及使用

並且 指針變量 使用 char 導致 數據 ios5 ret int

1:ARC環境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的。xcode 4.3(ios5和以上版本)之後就有了ARC,並且開始使用 strong與weak

2:weak的作用:在ARC環境下,所有指向這個對象的weak指針都將被置為nil。這個T特性很有用,相信很多開發者都被指針指向已釋放的對象所造成的EXC_BAD_ACCESS困擾過,使用ARC以後,不論是strong還是weak類型的指針,都不會再指向一個已經銷毀的對象,從根本上解決了意外釋放導致的crash。

3:assign的作用:簡單賦值,不改變引用計數,對基礎數據類型 (例如NSInteger,CGFloat)和C數據類型(int, float, double, char, 等) 適用簡單數據類型

assign: 用於非指針變量。用於
基礎數據類型 (例如NSInteger)和C數據類型(int, float, double, char, 等),另外還有id
如:
@property (nonatomic, assign) int number;
@property (nonatomic, assign) id className;//id必須用assign
反正記住:前面不需要加 “*” 的就用assign吧

4:copy的作用:建立一個索引計數為1 的對象,然後釋放舊對象

5:strong的作用:在ARC環境下,只要某一對象被一個strong指針指向,該對象就不會被銷毀。如果對象沒有被任何strong指針指向,那麽就會被銷毀。在默認情況下,所有的實例變量和局部變量都是strong類型的。可以說strong類型的指針在行為上跟非ARC下得retain是比較相似的


6:retain的作用:在非ARC時代,你需要自己retain一個想要保持的對象,ARC環境下就不需要了。現在唯一要做的就是用一個指針指向這個對象,只要指針沒有被重置為空,對象就會一直在堆上。當指針指向新值的時候,原來的對象就會被release一次。這對實例變量,sunthesize的變量或者是局部變量都是實用的。




assign: 簡單賦值,不更改索引計數(Reference Counting)對基礎數據類

copy: 建立一個索引計數為1的對象,然後釋放舊對象。對NSString

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1 ,對其他NSObject和其子類

weak和strong的區別:

weak和strong不同的是 當一個對象不再有strong類型的指針指向它的時候 它會被釋放 ,即使還有weak型指針指向它。一旦最後一個strong型指針離去 ,這個對象將被釋放,所有剩余的weak型指針都將被清除。

copy與retain的區別:

copy其實是建立了一個相同的對象,而retain不是;

copy是內容拷貝,retain是指針拷貝;

copy是內容的拷貝 ,對於像NSString,的確是這樣,如果拷貝的是NSArray這時只是copy了指向array中相對應元素的指針.這便是所謂的"淺復制"。

__block和__weak修飾符的區別

__block不管是ARC還是MRC模式下都可以使用,可以修飾對象,還可以修飾基本數據類型。

__weak只能在ARC模式下使用,也只能修飾對象(NSString),不能修飾基本數據類型(int)。

__block對象可以在block中被重新賦值,__weak不可以。

iOS 開發 property,strong,weak,retain,assign,copy,nomatic 的區別及使用