OC學習日記03-類和對象(二)OC語言中的方法 、設置器與訪問器、便利初始化函數與便利構造器

這裏寫圖片描述

類和對象


OC語言中的方法

方法:

類的功能代碼,在(.h)文件中聲明,在(.m)文件中實現。

語法:

-|+(返回類型)方法名:參數列表

//方法體

(—)表示:實例方法,

(+)表示:類方法。

-(void)sayHello;   //實例方法
 1. (void)sayHelloName:(NSString *)name
                 Age:(NSInteger )age;    //無返回值有參數的實例方法
+(void)sayHi;      //無返回值的類方法
+(void)hiGuys;

注意:

1.類方法可以調用類方法
2.類方法不可以調用實例方法,但是類方法可以通過判斷實例對象來訪問實例方法;
3.類方法不可以使用實例變量。類方法可以使用self,因爲self不是實例變量;
4.類方法作爲消息,可以被髮送到類裏面去,不能發送到

首先,在.h文件中聲明我們要使用的對象和方法;

{

    NSString *_name;
    NSInteger _age;
    NSString *_hobby;
}
-(void)sayHello;   //實例方法
- (void)sayHelloName:(NSString *)name
                 Age:(NSInteger )age;    //無返回值有參數的實例方法
+(void)sayHi;      //無返回值的類方法
+(void)hiGuys;

然後我們在.m文件中寫入無返回無參數的實例方法、無返回值有參數的實例方法,以及無返回值的類方法;

-(void)sayHello{
    NSLog(@"sayHello");
}
-(void)sayHelloName:(NSString *)name Age:(NSInteger)age
{
    NSLog(@"Hello guys!My name is %@.I am %ld years old.",name,age);
}
+(void)sayHi{
    NSLog(@"sayHi");
}
+(void)hiGuys
{
    //1.類方法可以調用類方法
    //self是什麼?self 當前對象的指針
    [self sayHi];

    //2.類方法不可以調用實例方法,但是類方法可以通過創建實例對象來訪問實例方法
    Person*  person=[Person new];
    [person sayHello];
    // 3.類方法不可以使用實例變量。類方法可以使用self,因爲self不是實例變量
   // NSLog(@"name:%@ ,age:%ld ,hobby:%@",_name,_age,_hobby);

最後我們在主函數中引用一下我們剛剛創建的幾個方法,這裏重點要 標註一下 [person sayHelloName:@”Aaaa” Age: 25];這種帶參數的方法;這種是很多方法的一種通用形式,後面很多特殊的函數以及構造器都是和這種方法相像的,一定要先去理解這種參數的意義。(與C的指針有一點相關)

    Person* person =[Person new];
        [person sayHello];
        [person sayHelloName:@"Aaaa" Age: 25];
          [Person sayHi];
        [Person hiGuys];

設置器與訪問器

設置器和訪問器的作用

1.隱藏了實例變量
2.控制變量的讀寫;
3.做正確性校驗;
(主要就是用來設置和訪問@protected和@private作用域的值)

設置器(setter)和訪問器(getter)的規命名規則

這裏寫圖片描述
1.設置器:-(void)set首字母大寫的實例變量:(實例變量的返回值類型)去掉下劃線的實例變量名;
2.訪問器 :-(實例變量的返回值類型)去掉下劃線的實例變量;

note:

對於類的名稱,其首寫字母大寫
對於變量,其首寫字母小寫
遵循駝峯命名規則。

在.h文件中我們對設置器與訪問器進行編寫,其實通過設置器和訪問器我們不難發現,設置器與訪問器其實也是一種方法,所以
我們可以把設置器看作:無返回值有參數的實例方法;訪問器看作有返回值無參數的實例方法;這樣來看的話,在.m文件中我們也可以很容易理解其中的內容。

{
    //@protected
    NSString *_name;
    NSInteger _age;
    NSString *_hobby;

}
//設置器與訪問器
//對於_name屬性的設置器
-(void)setName:(NSString*)name;
//name訪問器
-(NSString *)name;
//對於_age屬性的設置器
-(void)setAge:(NSInteger)age;
//age訪問器
-(NSInteger)age;
//對於_hobby屬性的設置器
-(void)setHobby:(NSString*)hobby;
//hobby訪問器
-(NSString *)hobby;

在.m文件中,我們進行設置器和訪問器的書寫,設置器就是將引入的參數的值賦值給實例變量,訪問器就是將需要的實例變量的值返回回去:

-(void)setName:(NSString*)name{
    _name= name;
}

-(NSString *)name{
    return _name;
}
//做正確性校驗
-(void)setAge:(NSInteger)age
{
    if(_age>=0|_age<18){
    _age = 18;
    }else if(_age < 0){
        NSLog(@"請重新輸入正確的年齡");
    }else{
        _age = age;
    }

}
-(NSInteger)age{
        return _age;

}
-(void)setHobby:(NSString *)hobby{

    _hobby= hobby;
    if([_hobby isEqualToString:@"play LOL"]){
        _hobby=@"niuB";
    }else{
        _hobby=@"lowB";
    }
}
-(NSString *)hobby{
    return _hobby;
}

在主函數main.m中,我們可以建立一個stu的對象,然後對其調用設置器,以及使用訪問器訪問我們需要的數據,看一下最終效果:

        Student* stu=[Student new];
        [stu setName:@"Jack"];
        [stu setAge:25];
        [stu setHobby:@"play LOL"];
        NSString *name=[stu name];
        NSInteger age =[stu age];
        NSString *hobby=[stu hobby];
        NSLog(@"name =%@ ,age= %ld ,hobby=%@",name ,age,hobby);

運行結果爲:
這裏寫圖片描述


便利初始化函數與便利構造器

  • id:返回的類型是id數據類型,它是動態數據類型,可一直指向任何類的對象,而不關心其具體類型,在運行時檢查其具體類型,可以對其發送任何(存在的)消息。
  • self:指當前對象的指針。
  • super:指向父類對象的指針,子類使用super發送消息的時候,實際上就是告訴子類調用父類的方法。如果父類沒有定義該方法,則繼續在繼承鏈上查找,直到尋找到位置,如果找到NSOject的位置還沒有找到,就會報錯。

便利構造器

便利構造器只不過是把對象分配內存 和 調用便利初始化函數初始化對象的代碼封裝起來,讓用戶使用起來更加方便。

我們知道alloc的作用是爲建立的對象分配空間,而init 的作用是爲建立的對象的變量進行初始化,而如果我們對變量的值有要求的時候,我們就可以通過重寫init 進行自定義初始化函數。
便利初始化函數可以通過方法-(id)init進行全局定義;
而有時候我們只需要個別改變的話,我們就可以通過使用-(id)initWithName
而對alloc以及-(void)initWithName進行封裝的話,就形成了便利化構造器。
這是.h文件的代碼:

@interface Teacher : NSObject
{
    NSString *_name;
    NSInteger _age;
    NSString *_hobby;

}
-(void)sayWord;
//便利初始化函數
//注意命名規範:init開頭
-(id)initWithName:(NSString *)name
              Age:(NSInteger)age;

+(id)teacherWithName:(NSString *)name Age:(NSInteger)age;

這是.m文件的代碼:

-(void)sayWord{
    NSLog(@"name= %@ ,age=%ld",_name,_age);
}

-(id)init{
    if(self =[super init]){
        _name=@"Rick";
        _age=25;
    }
    return self;
}

-(id)initWithName:(NSString *)name
              Age:(NSInteger )age{
    if(self=[super init]){
        _name=name;
        _age=age;
    }
    return self;
}
+(id)teacherWithName:(NSString *)name Age:(NSInteger)age{
    //封裝起來
    Teacher *teacher=[[Teacher alloc]initWithName:name Age:age];
    return teacher;
}

這是主函數main.m的代碼:

       // 便利初始化函數 (-)   與     便利構造器  (+)
        Teacher *teacher=[[Teacher alloc]init];
        [teacher sayWord];
        Teacher *teacher1=[[Teacher alloc]initWithName:@"Jack" Age:25];
        [teacher1 sayWord];
        Teacher *teacher2=[Teacher teacherWithName:@"Rick" Age:25];
        [teacher2 sayWord];

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章