Object-c @Property

http://blog.csdn.net/dqjyong/article/details/7668601(原博客)
安全

如下是對原博客的整理函數

導航:atom

讀寫屬性:(readwrite/readonly)以及(getter=name)、(setter=name)spa

setter語意:(assign/retain/copy).net

原子性: (non)atomic線程

從OC 2.0開始,咱們能讓系統自動生成設置變量值的方法或獲取變量值的方法,即系統會自動爲咱們生成setter/getter方法。
指針

@property(attribution)Vartype  Varname;對象

Setter and Getterblog

提醒一下,採用@property與自定義setter和getter方式實際上是等價的,可是編譯器會優先查找自動的setter/getter方法,若是找不到,就會使用@property對應的屬性。
ci

@propert(nonatomic ,copy)NSString *name;

 這條語句等價於:

 完成setter方法爲:

        -(void)setName:(NSString*)newName{

              if(newName!=name){

                     [name release];

                     name=[newName  copy];

             }

        }

       完成getter方法爲:

       -(NSString*)name{

               return name;

        }

下面詳細來講明這些屬性的差別

Readonly

讀寫屬性中,readwrite能夠獲取實例變量的值。對於@synthesize,編譯器會自動爲該變量生成getter和setter方法。而readonly表示只讀變量,不能設置實例變量的值,編譯器不會爲其生成setter方法,所以須要進行初始化。而getter/setter=name,是爲(getter)/(setter)方法使用name指定的名稱,而不是實例變量名稱。

setter語意assign/retain/copy 決定了以何種方式對數據成員賦予新值。對於Objective-C中的通常object,最好使用用retain。一些特別的object(例如:string)使用copy。

Assign

而assign關鍵字表明setter直接賦值,而不是複製或者保留它,更不須要進行引用計數。這種機制很是適合一些基本數據類型,好比NSInteger和CGFloat,或者你並不直接擁有的類型,好比delegates((且必定要用assign,具體緣由暫時不知道,讀者看到這裏能夠留言給我,告訴我答案)。

Retain

這裏聲明一下,什麼是基本基本類型呢? 基本類型就是gc(gc就是垃圾回收的意思)隊形,而且只有基本數據類型是gc對象,其它都是非gc的。好比int,float等基本數據類型。而NSString是非gc類型,因此用assign就不適合,而推薦作法是NSString用copy。而類如NSArray,NSDate等其它objc類型,推薦用retain。

Retain和Copy對比

而copy與retain的具體區別爲:copy實際上是創建了一個相同的對象,而retain只是保存其對象,而且其計數值+1。

例如:一個NSString對象,地址爲0×1000,內容爲@」string」 

copy到另一個NSString以後,地址爲0×2000,內容相同,新的對象retain爲1,舊有對象沒有變化 

retain到另一個NSString以後,地址相同(創建一個指針,指針拷貝),內容固然相同,可是這個新對象的retain值+1,並釋放舊的對象。

也就是說,retain是指針拷貝,copy是內容拷貝。 

Atomic

atomicity的默認值是atomic,讀取函數爲原子操做。atomic是保證讀取變量是線程安全的,即它會保證每次getter和setter的操做都會正確的執行完畢,而不用擔憂其它線程在你get的時候set,能夠說保證了某種程度上的線程安全。而nonatomic是不能保證線程安全的。可是nonatomic比atomic速度要快。這也是爲何property基本上都用nonatomic了。 最後加上一句,僅僅靠atomic來保證線程安全是不可能的,要寫出線程安全的代碼,仍是須要有同步和互斥機制。

P:注意

       1.readonly關鍵字表明setter不會被生成, 因此它不能夠copy/retain/assign組合使用。 

       2.默認的property行爲有:atomic,assign,readwrite。

       若是這樣使用:@property  BOOL _flag;//表明這_flag有着atomic,assign,readwrite三種行爲。因此咱們必定要提防這種默認行爲潛在的危險。

如:@property NSMutableArray *photoViews;//此時會有警告出現,由於NSMutableArray是一種obj類型,而且是 NSArray類型,根據前面的分析,最好採用retain。因此默認的assign會帶來警告提示。

相關文章
相關標籤/搜索