1. 程式人生 > >黑馬程式設計師--OC基礎[email protected]和@synthesize

黑馬程式設計師--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的增強功能