先前我們學的實例變數是這樣的 1 { 2 int _age; 3 int _height; 4 int age; 5 } 後來學屬性 1 @property int age; 看到@property 會自動編譯生成某個成員變數的setter方法和getter方法的聲明 1 - (void)setAg
先前我們學的實例變數是這樣的
1 { 2 int _age; 3 int _height; 4 int age; 5 }
後來學屬性
1 @property int age;
看到@property 會自動編譯生成某個成員變數的setter方法和getter方法的聲明
1 - (void)setAge:(int) age; 2 - (int)age;
舉例:
@property int _age;
就會編譯生成
- (void)set_age:(int) age;
- (int)_age;
也就是說你怎麼寫實例變數就會怎麼編譯生成,為了生成標準的實例變數的setter方法和getter方法的聲明,所以屬性不要再加 _ 了,並且setAge大寫
既然使用@property有了實例變數的setter方法和getter方法的聲明,那麼實現就是@synthesize property
1 // 後面要求寫屬性,明確要對哪個屬性實現一下setter、getter方法 2 @synthesize age
看到@synthesize 會自動編譯生成某個成員變數的setter方法和getter方法的實現
1 - (void)setAge:(int)age { 2 _age = age; 3 } 4 5 - (int)age { 6 return age; 7 }
如果硬要去訪問 _age 那個成員變數,就
@synthesize age = _age;
這樣會自動生成age的setter方法和getter方法的實現,並且會去訪問_age這個成員變數
註意:左邊的age:要實現的是age的setter方法和getter方法
右邊的age:是在實現里去訪問_age這個成員變數,所以這樣就將屬性和實例變數聯繫在一起了
系統規定成員變數要加 _ 修飾
上面的@synthesize age;沒寫後面的成員變數,會預設訪問age
此時:會自動訪問_age這個成員變數,如果不存在,就會自動生成@private類型的_age實例變數,在延展中聲明,是私有的
XCode4.n之後 @property 即生成聲明有生成實現
1 @property int age;
屬性是實例變數_age的一對setter、getter方法的聲明和實現
預設情況下,setter、getter方法中的實現會去訪問 _ 開頭的實例變數
學到這裡,就清楚了為什麼一開始我們學的時候成員變數以 _ 開頭,其實系統內部是這樣的