參考資料編程
http://blog.csdn.net/pingchangtan367/article/details/14000315數組
http://blog.csdn.net/xdrt81y/article/details/9720121安全
首先 @property 是聲明對象用的 看這個列子,多線程
//in BaseClass.h @interface BaseClass : NSObject{ @public NSString *_name; } @property(nonatomic,copy) NSString *name; //in BaseClass.m @synthesize name = _name; @end BaseClass *base=[[BaseClass allow]init]; base.name(這樣的花能夠直接引用name) base._name(這樣就是不能直接引用的)
@property起了一個修飾的做用 至於@property(....) 一系列的參數 就是對當前修飾對象的一個進一步內存上的修飾 函數
1.atomic 和 nonatomic性能
atomic是默認的屬性,表示對對象的操做屬於原子操做,主要是在多線程的環境下,提供多線程訪問的安全。咱們知道在多線程的下對對象的訪問都須要先上鎖訪問後再解鎖,保證不會同時有幾個操做針對同一個對象。若是編程中不涉及到多線程,不建議使用,由於使用atomic比nonatomic更耗費系統資源。atom
nonatomic 表示訪問器的訪問不是原子操做,不支持多線程訪問安全,可是訪問性能高。spa
2.readwrite 和readonly.net
readwrite 是默認的屬性,表示能夠對對象進行讀和寫,會生成對象相應的setter和getter方法。線程
readonly 表示只容許讀取對象的值,只會生成對象的getter方法。
3.retain,assign和copy
retain 表示對NSObject和及其子類對象release舊值,再retain新值,使對象的應用計數增長一。
此屬性只能使用於obejective-c類型對象,而不能用於Core Foundation對象。(retain會增長對象的引用計數,而基本數據類型或者Core Foundation對象都沒有引用計數,把對象添加到數組中時,引用計數將增長1)。
- (void) setOldValue: (NSString*) newValue {
if (newValue !=oldValue) {
[oldValue release];
oldValue = [newValue retain];
}
}
assign 是默認屬性,只能夠對基本數據類型(如CGFloat,NSInteger,Bool,int,代理對象)等使用。該方式會對對象直接賦值而不會進行retain操做。
copy 表示從新創建一個新的計數爲1的對象,而後釋放掉舊的值。
都知道retain是對指針的拷貝,copy是對內容的拷貝。好比:NSString 對象的地址爲0x100,其內容爲「string」,若是使用copy到另一個NSString對象,則會生成另一個地址爲0x110的對象,只不過內容仍然是‘string「。若是使用retain到另一個NSString對象,則該對象的地址仍然爲0x100,只不過該對象的計數變爲2.
4.strong 和 weak
在ARC的模式下,對象聲明時須要加入strong和weak,方便內存的自動管理。默認狀況下是strong類型。
strong 強引用,默認的屬性,相似於retain,實際上是一個相對的概念,就是一個引用。若是有一個強引用持有該對象,則該對象就不能被釋放。默認的全部實例變量和局部變量都是strong指針。
weak 弱引用,相似於assign,弱引用除了不決定對象的存亡外,其餘與強引用相同。即便一個對象被持有無數個若引用,只要沒有強引用指向他,那麼其仍是會被清除,它不是對象的擁有者。其值會在對象被釋放後自動設置爲nil。
weak指針主要用於「父-子」關係,父親擁有一個兒子的strong指針,所以父親是兒子的全部者;但爲了阻止全部權循環,兒子須要使用weak指針指向父親。典型例子是delegate模式,你的ViewController經過strong指針(self.view)擁有一個UITableView, UITableView的dataSource和delegate都是weak指針,指向你的ViewController。
那麼看看@property究竟幹了什麼??
仍是上面的Demo; @interface BaseClass : NSObject{ @public NSString *_name; } //@property(nonatomic,copy) NSString *name; -(NSString*) name; -(void) setName:(NSString*)newName; @end 把@property的定義註釋掉了,另外定義了兩個函數,name和setName,下面請看實現文件: //@synthesize name = _name; -(NSString*) name{ return _name; } -(void) setName:(NSString *)name{ if (_name != name) { [_name release]; _name = [name copy]; } } 如今,你再編譯運行,同樣工做的很好。why?由於我剛剛作的工做和先前聲明@property所作的工做徹底同樣。@prperty只不過是給編譯器看的一種指令,它能夠編譯以後爲你生成相應的getter和setter方法。並且,注意看到面property(nonatomic,copy)括號裏面這copy參數了嗎?它所作的事就是_name = [name copy];或者上面一系列的參數
Property定義:@property 聲明用於自動建立property屬性變量的getter和setterSynthesize定義:@Synthesize聲明實現了property屬性變量的getter和setter。