天天看點

黑馬程式員_OC學習之@property、點文法

---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------

一、點文法:通過"."調用類中的set和get方法來設定和通路成員變量

例如:

<span style="font-size:18px;">#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    @private
    int _age;
    @public
    int _id;
}

- (int)age;
- (void)setAge:(int)age;
@end

@implementation Person
- (int)age {
    return _age;
}
- (void)setAge:(int)age {
    if(age < 0) {
        age = 1;
    }
    _age = age;
}
@end

@interface Student : Person

@end

@implementation Student

@end

int main() {
    
    Person *p = [Student new];  //學生同時也是人
    p.age = 10; //這句話等同于[p setAge]
    NSLog(@"%d",p.age); //OC會自動檢測是通路還是設定成員變量,這裡為通路是以等同于[p age];
    
    return 0;
}</span>
           

注意:使用點文法設定成員變量在許多語言中都存在,不過在oc中,點文法不是直接操縱成員變量,而是調用set和get方法。

----------------------------------------------------------------------------------------------------------------------------------------------------------

二、@property:與@synthesize共用,讓OC自動生成get和set方法,在xcode4.4以後,@synthesize功能已經被@property取代,不過還有一個功能,我們通過例子來介紹。

先說下@property三個功能:1、聲明一個成員變量的get和set方法;

2、實作該成員變量的get和set方法;

3、如果這個成員變量沒有定義,那麼會自動生成一個以下劃線"_"開頭的變量(預設是通路屬性為@private);

例如:

<span style="font-size:18px;">#import <Foundation/Foundation.h>

@interface Person : NSObject
{
//    int _age; //如果沒有定義該成員變量,那麼會自動生成這個名字的成員變量。
    int age; //如果變量名字這樣命名,那麼@property會不清楚使用這個變量還是_age這個變量,這時我們就要使用@synthesize來幫助@property取消歧義。
}
@property int age;  //等同于下面兩句
//- (int)age;
//- (void)setAge:(int)age;
@end

@implementation Person

@synthesize age = age;  //指明使用age這個變量,而不是生成_age

@end

int main() {
    
    Person *p = [Person new];
    p.age = 10;
    NSLog(@"%d",p.age);
    
    return 0;
}</span>
           

注意:使用@property可以幫助我們省掉許多不必要的代碼,但是如果我們想讓某個類的子類通路該類的成員變量,就必須自己定義變量,而不用@property生成,因為它生成的是具有@private屬性的成員變量。

---------------------- ASP.Net+Unity開發、.Net教育訓練、期待與您交流! ----------------------詳細請檢視:www.itheima.com