1.重寫init方法
想在對象創(chuàng)建完畢后,成員變量馬上就有一些默認(rèn)的值就可以重寫init方法
重寫init方法格式:
- (id)init {
self = [super init];
if (self) {
// Initialize self.
}
return self;
}
[super init]的作用:
面向?qū)ο蟮捏w現(xiàn),先利用父類的init方法為子類實例的父類部分屬性初始化。self 為什么要賦值為[super init]:
簡單來說是為了防止父類的初始化方法release掉了self指向的空間并重新alloc了一塊空間。還有[super init]可能alloc失敗,這時就不再執(zhí)行if中的語句。
重寫init方法其它格式
- (id)init {
if (self = [super init]) {
// Initialize self.
}
return self;
}
??構(gòu)造方法使用注意
●子類擁有的成員變量包括自己的成員變量以及從父類繼承而來的成員變量,在重寫構(gòu)造方法的時候應(yīng)該首先對從父類繼承而來的成員變量先進(jìn)行初始化。
◆原則:先初始化父類的,再初始化子類的。
◇先調(diào)用父類的構(gòu)造方法[super init];
◇再進(jìn)行子類內(nèi)部成員變量的初始化。
●千萬不要把self = [super init]寫成self == [super init]
●重寫構(gòu)造方法的目的:為了讓對象方法一創(chuàng)建出來,成員變量就會有一些固定的值。
●instancetype的作用
instancetype與id相似,不過instancetype只能作為方法返回值,它會進(jìn)行類型檢查,如果創(chuàng)建出來的對象,賦值了不相干的對象就會有一個警告信息,防止出錯。
// init此時返回值是id
NSString *str = [[Person alloc] init];
// Person并沒有l(wèi)ength方法, 但是id是動態(tài)類型, 所以編譯時不會報錯
NSLog(@"length = %i", str.length);
// init此時返回值是instancetype
// 由于instancetype它會進(jìn)行類型檢查, 所以會報警告
NSString *str = [[Person alloc] init];
NSLog(@"length = %i", str.length);
instancetype *p = [[person alloc] init];
// 錯誤寫法instancetype只能作為返回值