IOS變量的property屬性設置和意義總結

最近有機會對IOS的property屬性進行了一個全面的瞭解和總結:編程

IOS 的@property和@synthesize幫咱們輕易的生成對象的getter和setter方法來完成對對象的賦值和訪問。可是若是咱們若是要動態設置對象的getter和setter方法可使用@property和@dynamic組合。對象訪問方法property的屬性設置很是多,諸如:atomic和nonatomic,readwrite和readonly,retain,assign和copy,strong和weak。數組

1.atomic 和 nonatomic安全

atomic是默認的屬性,表示對對象的操做屬於原子操做,主要是在多線程的環境下,提供多線程訪問的安全。咱們知道在多線程的下對對象的訪問都須要先上鎖訪問後再解鎖,保證不會同時有幾個操做針對同一個對象。若是編程中不涉及到多線程,不建議使用,由於使用atomic比nonatomic更耗費系統資源。多線程

nonatomic 表示訪問器的訪問不是原子操做,不支持多線程訪問安全,可是訪問性能高。性能

 2.readwrite 和readonlyatom

readwrite 是默認的屬性,表示能夠對對象進行讀和寫,會生成對象相應的setter和getter方法。spa

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。

相關文章
相關標籤/搜索