1. 程式人生 > >OC中init方法的重寫和自定義

OC中init方法的重寫和自定義

一、init方法介紹

OC中的init方法的作用是在物件例項化後對其初始化,在其它程式語言中(如Java、C++)都有構造方法,OC中init方法和構造方法是一個概念的。

假設有如下的類宣告和實現:

#import <Foundation/Foundation.h>
@interface Student : NSObject
@property NSString *name;
@property int age;
@property float score;
-(void)show;
@end

@implementation Student
-(void)show
{
    NSLog(@"I am a Student,My name is %@ ,%d years old",_name,_age);
}
@end

呼叫Student類的類方法new

Student *s1=[Student new];

其等價於

Student *s2=[[Student alloc] init];

其中alloc方法用於實現化一個物件,init用來將物件初始化。

預設的初始化規則是:

基本資料型別初始化為0

指標資料型別初始化為空

如果我們不想使用預設的初始化規則,則可以重寫init方法或自定義init方法。


二、重寫init方法

    重寫init方法必須符合如下規範:

- (instancetype)init
{
    self = [super init]; //用於初始化父類
    if (self) {
//        do something
    }
    return self;
}

下面我們將重寫Student類的init方法

- (instancetype)init
{
    self = [super init]; //用於初始化父類
    if (self) {
        [email protected]"小明";
        self.age=18;
    }
    return self;
}

在main函式中使用使用new類方法例項化一個物件

Student *s1=[Student new];
[s1 show];


執行結果:

I am a Student,My name is 小明 ,18 years old

Program ended with exit code: 0


    三、自定義的init方法

自定義的init方法常用於在初始化物件時指定物件的值,同樣的,自定義的init方法也需要遵守一定的語法規範:


- (instancetype)initWithName:(NSString *)name andAge:(int)age
{
    self = [super init];
    if (self) {
//        statements
    }
    return self;
}

自定義的init方法需要在@inferface中宣告而且其中方法名必需符合initWithXXX: … andXXX:…

否則編譯編譯器不會把它當做init方法,導致錯誤。


main函式中使用使用自定義init方法例項化一個物件


Student *s2=[[Student alloc ]initWithName:@"小華" andAge:21];
[s2 show];

執行結果:

I am a Student,My name is 小華 ,21 years old

Program ended with exit code: 0