天天看點

OC的@property 和 @synthesize id

學習java的JDBC,成員變量的setter和getter,eclipse都能幫我們自動生成;當然xcode這款編譯器也很強大,也能自動生成;

1:@property 

     @property是寫在類的聲明中的,具體寫法;

@interface  Person : NSObject
{
      _age;
}
@property int age; // 這句話相當于下邊的getter和setter,但是注意age沒有'_',但是就是為有下劃線的age生成的,這樣友善了點文法的調用;
// - (void)setAge:(int)age;
// - (int)age;
@end      

是以寫法:@property   (成員變量的類型) 去掉下劃線的成員變量名

2:@synthesize:setter和getter方法的實作,在implementation中;

@implementation

@synthesize  age = _age; // 注意格式,等号左邊表示實作age的setter和getter,即 setAge  和  age; 等号右邊表示通路那個成員變量;

// 代替了下面這兩個方法;
/*
- (void)setAge:(int)age
{
       _age = age;
}
- (int)age
{
      return _age;
}
*/
@end      

3:@property  @synthesize後邊可以同時并列多個成員變量,前提是這幾個成員變量的類型一樣

// @property寫法
@property  int age, weight; // 以逗号分隔,前提是age和weight都是int型的;
// @synthesize寫法
@synthesize age = _age, weight = _weight;       

4:如果自己沒有明确的定義成員變量,比如_age,然後寫了@property int age;這句話會自動為我們生成_age這個成員變了,但是它的通路權限是private的

5:現在版本的@property功能更強大,獨攬了setter和getter的聲明和實作;可以隻寫@property,而不用寫@synthesize,xcode也會自動生成setter和getter的聲明與實作,并且你也可以不用定義成員變量,它也能自動為我們生成帶有下劃線的成員變量,隻不過是private的;

@interface Student : NSObject
@property int age; // 這句話做了3件事
/*
1:為我們生成了_age這個成員變量,private的;
2:聲明了age得setter和getter方法;
3:在implementation中實作了setter和getter
*/
@end      

@property  @synthesize的使用注意;

   如果@synthesize age;  這樣寫 他會通路的時和age同名的成員變量,不會通路_age;  如果沒有age,他會自動生成@private的age;

   方法也是一樣,如果setter和getter我們自己寫了,它會優先用我們自己寫得,如果沒有,它才會自動生成;xcode的特性就是這樣,優先選擇我們自己寫得,如果我    們沒寫,它才自動生成;

id

萬能指針,能指向任何OC對象,定義方式:id d = [Person new];注意定義時不要加*;如果說OC中所有的類都繼承了NSObject,那麼id相當于: NSObject *;

繼續閱讀