黑馬程式設計師--OC基礎[email protected]和@synthesize
1、@property關鍵字
(1)基本概念
@property是編譯器指令,所謂編譯器指令,就是告訴編譯器要做什麼。
@property告訴編譯器宣告屬性的訪問器(setter/getter)方法,這樣的好處是免去了程式設計師編寫set和get的方法。
(2)用法
基本格式如下:
@property 型別名 方法名
例:@property int age; //進行了age的set和get方法的宣告
等同於 -(void)setAge: (int)age;
-(int)age;
@property在宣告中的運用:
#import <Foundation/Foundation.h>
@interface Person:NSObject{
NSString *_name;
int _age;
int _num;
}
@property int age; //替代了下面age的set和get方法宣告
/*
-(void)setAge: (int)age;
-(int)age;
*/
@property NSString * name; //替代了下面name的set和get方法宣告
/*
-(void)setName: (NSString *)name;
-(NSString *)name;
*/
@property int num; //替代了下面num的set和get方法宣告
/*
-(void)setNum: (int)num;
-(int)num;
*/
@end
@implementation Person
...
...
@end
我們可以發現,通過使用@property關鍵字,程式設計師在編寫set和get方法的宣告能省去很多步驟,提高了編寫程式碼的效率。
(3)@property的使用注意事項
1–@property只能寫在@interface和@end中間
2–@property用來自動宣告成員變數的set/get方法的宣告(xcode4.4之前)
3–使用@property需要告訴它成員變數的型別
4–@property中的方法名是成員變數名去掉下劃線
2、@synthesize關鍵字
我們發現使用@property能極大的減少程式設計師編寫set/get方法的宣告部分的程式碼,提高了編寫程式碼的效率,那麼,此時,程式設計師也希望不僅是宣告部分能有像@property這樣的關鍵字,也希望在實現部分有某種關鍵字能減輕實現部分的程式碼工作,那麼,在OC語言中就出現了@synthesize這樣一個關鍵字。
(2)@synthesize基本概念
@synthesize是和@property相對應的,@synthesize主要是在.m檔案中定義set/get方法的實現。
(3)@synthesize用法
基本格式如下:
@synthesize 方法名 //方法名必須在宣告中使用@property 型別名 方法名
例:@synthesize age; //進行了age的set和get方法的宣告
等同於
-(void)setAge: (int)age{
self->age=age;//注意:此時編譯器幫我們聲明瞭一個變數age,因此要用self指代這個age
}
-(int)age{
return age;//返回的是生成的那個變數age
}
@synthesize在實現中的運用:
#import <Foundation/Foundation.h>
@interface Person:NSObject{
NSString *_name;
int _age;
int _num;
}
@property int age; //替代了下面age的set和get方法宣告
/*
-(void)setAge: (int)age;
-(int)age;
*/
@property NSString * name; //替代了下面name的set和get方法宣告
/*
-(void)setName: (NSString *)name;
-(NSString *)name;
*/
@property int num; //替代了下面num的set和get方法宣告
/*
-(void)setNum: (int)num;
-(int)num;
*/
@end
@implementation Person
@synthesize age; //替代了下面age的set和get方法實現
/*
-(void)setAge: (int)age{
self->age=age;
}
-(int)age{
return age;
}
*/
@synthesize name; //替代了下面name的set和get方法實現
/*
-(void)setName: (int)name{
self->name=name;
}
-(int)name{
return name;
}
*/
@synthesize num; //替代了下面num的set和get方法實現
/*
-(void)setNum: (int)num{
self->num=num;
}
-(int)num{
return num;
}
*/
@end
通過使用@synthesize關鍵字,我們發現方法的set和get實現程式碼又減少了很多,這又極大的增大了程式設計師編寫程式的效率。
(4)@synthesize指定例項變數賦值
使用格式:
@synthesize 方法名 = 變數名;
例:
@property int age;
@synthesize age = _age;
相當於
-(void)setAge:(int)age{
_age=age;
}
-(int)age{
return _age;
}
我們發現,此時編譯器不會生成也不會操作預設的變量了
3、@property的增強使用
所謂@property的增強使用,就是指xcode4.4版本之後,@property的有了更多的功能。
1)xcode4.4之後,可以只使用@property而不使用@synthesize就能達到set/get方法的宣告和實現
2)操作的是帶有下劃線的例項變數
3)如果我們當前類沒有下劃線的例項變數,則系統會幫我們生成
4)生成的帶有下劃線的變數都是私有(相對)變數,也就是隱藏的變數,只有當前類能看到和使用。
5)@property增強模式下可以在.m中對set和get方法重寫,但是set和get方法的重寫只能出現一個,除非不使用@property的增強功能