天天看點

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

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

類和對象

OC語言中的方法

方法:

類的功能代碼,在(.h)檔案中聲明,在(.m)檔案中實作。

文法:

-|+(傳回類型)方法名:參數清單

//方法體

(—)表示:執行個體方法,

(+)表示:類方法。

-(void)sayHello;   //執行個體方法
  (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: ];
          [Person sayHi];
        [Person hiGuys];
           

設定器與通路器

設定器和通路器的作用

1.隐藏了執行個體變量

2.控制變量的讀寫;

3.做正确性校驗;

(主要就是用來設定和通路@protected和@private作用域的值)

設定器(setter)和通路器(getter)的規命名規則

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

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>=|_age<){
    _age = ;
    }else if(_age < ){
        NSLog(@"請重新輸入正确的年齡");
    }else{
        _age = age;
    }

}
-(NSInteger)age{
        return _age;

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

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

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

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

運作結果為:

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

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

  • 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]){
        [email protected]"Rick";
        _age=;
    }
    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:];
        [teacher2 sayWord];
           
OC學習日記03-類和對象(二)OC語言中的方法 、設定器與通路器、便利初始化函數與便利構造器類和對象設定器與通路器便利初始化函數與便利構造器

繼續閱讀