objective-c中的屬性

@property中的聲明列表已分類爲如下幾種:多線程

1, 聲明屬性的訪問方法:atom

  • getter=getterName
  • setter=setterName
    聲明訪問屬性的設置與獲取方法名。

2,聲明屬性寫操做權限:spa

  • readwrite
    聲明此屬性爲讀寫屬性,便可以訪問設置方法(setter),也能夠訪問獲取方法(getter),與readonly互斥。
  • readonly
    聲明此屬性爲只讀屬性,只能訪問此屬性對應的獲取方法(getter),與readwrite互斥。

3,聲明寫方法的實現:線程

  • assign
    聲明在setter方法中,採用直接賦值來實現設值操做。如:

-(void)setName:(NSString*)_name{
     name = _name;
}

retain

聲明在setter方法中,須要對設過來的值進行retain 加1操做。如:code

-(void)setName:(NSString*)_name{
     //首先判斷是否與舊對象一致,若是不一致進行賦值。
     //由於若是是一個對象的話,進行if內的代碼會形成一個極端的狀況:當此name的retain爲1時,使這次的set操做讓實例name提早釋放,而達不到賦值目的。
     if ( name != _name){
          [name release];
          name = [_name retain];
     }
}

  • copy
    調用此實例的copy方法,設置克隆後的對象。實現參考retain。

4,訪問方法的原子性:對象

  • nonatomic
    在默認的狀況下,經過synthesized 實現的 setter與getter 都是原子性訪問的。多線程同時訪問時,保障訪問方法同時只被訪問一個線程訪問,如:

[ _internal lock ]; // lock using an object-level lock
id result = [ [ value retain ] autorelease ];
[ _internal unlock ];
return result;

但若是設置nonatomic時,屬性的訪問爲非原子性訪問。內存

總結: 須要全局訪問的變量儘可能聲明成屬性來進行賦值,聲明成成員變量沒法保持引用計數的一致性從而致使崩潰,在內部訪問數據時使用成員變量或屬性都是能夠的,在對屬性進行賦值時,會調用屬性的set方法,使引用計數加一從而保證內存的正確引用。get

相關文章
相關標籤/搜索