property是一種代碼生成機制,能夠生成不同類型的getter/setter函數。
用法如:@property (attribute1,attribute2) float value;
一、在MRC中這些attribute包括:
readonly 表示這個屬性是隻讀的,就是隻生成getter方法,不會生成setter方法。
readwrite 可讀可寫(預設)設定可通路級别。
assign:簡單指派,不更改索引計數。
copy:建立一個索引數為1的對象,然後釋放舊對象。
retain:釋放(release)舊對象,将舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1。
atomic: 是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成資料錯誤。而這種機制是耗費系統資源的,是以在iPhone這種小型裝置上,如果沒有使用多線程間的通訊程式設計,那麼nonatomic是一個非常好的選擇。
nonatomic:非原子性通路,不加同步,多線程并發通路會提高性能。注意,如果不加此屬性,則預設是兩個通路方法都為原子型事務通路。
copy其實是建立了一個相同的對象,而retain不是:
比如一個NSString對象,位址為0x1111,内容為@"STR" ,copy到另外一個NSString之後,位址為0x2222,内容相同,新的對象retain為1,舊有對象沒有變化。
retain 到另一個NSString之後,位址相同(建立一個指針,指針拷貝),内容當然相同,這個對象的retain值+1,也就是說,retain是指針拷貝,copy是内容拷貝。在拷貝之前,都會釋放舊的對象。
assign:簡單指派,不更改索引計數(Reference Counting)。
copy:建立一個索引計數為1的對象,然後釋放舊對象
retain:釋放舊的對象,将舊對象的值賦予輸入對象,再提高輸入對象的輸入對象的索引計數為1
@property (nonatomic,retain)NSString *name; 的實際文法:
-(void)setName(NSString*)newName
{
if(name!=newName)
{
[name release];
name=[newName retain]; // name的引用計數has been bumped up by 1;
}
}
@property (nonatomic,copy)NSString *name; 的實際文法:
-(void)setName(NSString*)newName
{
if(name!=newName)
{
[name release];
name=[newName copy]; // name的引用計數has been bumped up by 1;
}
}
用法:
使用assign:對基礎資料類型(NSInteger)和C資料類型(int ,float,double,char等)
使用copy:對NSString
使用retain:對其他NSObject和其子類
二、在ARC中,reatin和copy不再使用,改用了Strong和weak
在arc中,如果沒有強指針指向對象,對象就會被釋放。
強指針:預設的情況下,所有的指針都是強指針,關鍵字strong
弱指針:_ _weak關鍵字修飾的指針
聲明一個弱指針如下:
_ _weak Person *p;
ARC中,隻要弱指針指向的對象不在了,就直接把弱指針做清空操作。
_ _weak Person *p=[[Person alloc] init];//不合理,對象一建立出來就被釋放掉,對象釋放掉後,ARC把指針自動清零。
ARC中在property處不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。
@property(nonatomic,strong)Dog *dog;// 意味着生成的成員變量_dog是一個強指針,相當于以前的retain。
如果換成是弱指針,則換成weak,不需要加_ _。
在ARC中@property的說明:
Strong:相當于原來的retain(适用于OC對象類型),成員變量是強指針
Weak:相當于原來的assign,(适用于oc對象類型),成員變量是弱指針
Assign:适用于非OC對象類型(基礎類型)