構造方法可以重寫嗎 剖析透構造方法

2021-10-18 10:55:28 字數 1932 閱讀 4078

為什麼要呼叫父類的 init 方法?

當前類有 isa 指標,當前類的 isa 指標賦值是通過父類的 init 方法賦值的。

需要保證當前物件的父類屬性同時被初始化

重寫 init 方法的規範:

-(instancetype)init

return self;

}//person

#import @inte***ce person : nsobject

@property nsstring* name;

@property int age;

-(void)sayhi;

@end

#import "person.h"

@implementation person

-(void)sayhi

-(instancetype)init

return self;

}@end

//測試

person *p1 = [[person alloc] init]; = "杭城小劉",p1.age =22;

person *p2 = [person new]; = "杭城小劉",p2.age =22;

如果2個類的關係為組合關係,且它的乙個屬性是另乙個類的物件,那麼當該類初始化的時候預設它的屬性為 nil,那麼如何初始化?

-(instancetype)init

return self;

}//測試

person *p1 = [[person alloc] init]; != nil

注意:此時不能使用 new 來呼叫。(因為 new 的實現是先 alloc 再 init ,預設 init 的實現是給屬性賦預設值)

-(instancetype)initwithname:(nsstring *)name andage:(int)age

return self;

}//person

#import @inte***ce person : nsobject

@property nsstring* name;

@property int age;

-(instancetype)initwithname:(nsstring *)name andage:(int)age;

@end

#import "person.h"

@implementation person

-(instancetype)init

return self;

}//不能在構造方法之外給self賦值

//編譯器認為只有以initwith開頭的方法是構造方法

-(instancetype)initwithname:(nsstring *)name andage:(int)age

return self;

}@end

//測試

person *p1 = [[person alloc] init];

person *p2 = [person new];

person *p3 = [[person alloc] initwithname:@"杭城小劉2號" andage:23];

關於「自定義構造方法必須以 initwith 開頭」做個實驗

報錯資訊很明顯:不能在構造方法之外給 self 賦值

因為,編譯器認為只有以 initwith 開頭的方法是構造方法

構造方法可以有返回值嗎 剖析透構造方法

為什麼要呼叫父類的 init 方法?當前類有 isa 指標,當前類的 isa 指標賦值是通過父類的 init 方法賦值的。需要保證當前物件的父類屬性同時被初始化 重寫 init 方法的規範 instancetype init return self person import inte ce per...

構造方法 重寫 和 過載

構造方法 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。類可以有多個建構函式,可根據其引數個數的不同或引數型別的不同來區分它們,即建構函式的過載。重寫 當乙個子類繼承乙個父類,而子類中的方法與父類中的方法的名稱,引數個數 型別...

方法過載和重寫 構造方法

自定義構造方法 乙個類中允許出現多個同名但不同引數的方法,這種方法叫做方法過載 同乙個類中 方法名相同 引數 個數或型別 不同 與返回值 訪問修飾符無關 作用 讓開發者需要記憶的函式名大大降低,提高開發效率 注意 一般是類似的功能寫成過載 方法名相同 引數列表相同 返回值型別相同或者是其子類 返回許...