OC中init方法的重寫和自定義
阿新 • • 發佈:2018-12-09
一、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