OC 實例變量(instance var)與屬性(@property)的關係

01).@property

01>.自動生成getter 和 setter 方法的聲明

自動給當前類生成一個私有屬性(在@implementation中),這個屬性名稱自帶下劃線
自動生成getter 和 setter 方法的實現

02>.語法格式

  @property 數據類型 去掉下劃線的屬性名稱;

  批量生成      
  @property 數據類型 名稱,名稱,….;  
  注:類型必須相同
@property NSString *name,color;

03>.@property 生成的實現,沒有邏輯驗證

//重寫
- (void)setName:(NSString *)name
{
    if(name.length < 2)
    {
        _name = @"無名";
    }
    else
    {
        _name = name;
    }
}

重寫後依然會自動生成getter方法的實現

注:如果getter 和 setter 方法的實現全部重寫,就不會自動生成私有屬性了,需要自己寫

04>.@property可以帶參數

   語法格式:
   property(參數1,參數2,參數3......)數據類型 名稱;
  • 可變性 (Mutability)

    readonly,只生成getter方法,沒有setter方法

    readwrite,是默認的

  • 內存管理 (Memory management)

    assign,是默認的,適用於內置類型(int, bool等)或者代理對象(delegate),不存在引用計數機制。

    retain,只適用於對象,不適用內置類型(int, bool等)。當使用setter方法時,將對象的引用計數加1。

    copy,使用setter方法時,拷貝一個對象,即在內存中產生新對象,而不是把原來的對象的引用計數加1。顯然,複製出來的新對象的引用計數爲1。

  • 併發性 (Concurrency)

    nonatomic,訪問屬性非原子性,一般單線程聲明nonatomic,考慮到速度問題。多線程程序就不要使用nonatomic。

    atomic,訪問屬性原子性,與nonatomic相反。

  • API控制 (API control)

    getter=newGetterName,指定新的getter方法名,一般重新改寫BOOL實例變量的getter名。

@property(getter = isFinished)BOOL finished;

02).@synthesize

1>.自動生成getter 和 setter 方法的實現

2>.語法

  @synthesize @pro名稱;
  寫在@implementation裏,是真私有屬性
@synthesize name; //生成的私有屬性是不帶下劃線的

03>.自動生成私有屬性

解決方法 @synthesize @pro名稱 = 已經存在的屬性名;

@synthesize name = _name;

04>.注意

  類型不同也能批量生成
@interface HMPerson : NSObject
@property NSString *_name;
@property int _age;

@end

@implementation HMPerson
@synthesize name = _name,age = _age;

@end

03).setter和getter方法的調用

//顯示調用(發送消息)
[somePerson setName:@"小明"];  //setter
[somePerson name];    //getter
//隱式調用(點語法)
somePerson.name = @"Jack";     //setter
NSString *perName = somePerson.name;    //getter
//在實例方法中直接使用實例變量
-(void)someMethod
{
  NSString *myString = _name;
  _name = @"A string";
}

顯然直接使用實例變量會有風險,如內存泄露、循環引用等。最好訪問實例變量,都通過@property產生的setter和getter方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章