自定義初始化方法調用 [super init] 時報錯,編譯器提示「未找到初始化方法」或運行時崩潰。
Objective-C 初始化方法慣例以 init 開頭,駝峰命名,如:
- (instancetype)init- (instancetype)initWithFrame:(CGRect)frame- (instancetype)initWithName:(NSString *)name age:(NSInteger)age用戶代碼中寫成 initwith...(小寫 w),導致:
[super init] 調用鏈中斷,屬性未正確初始化。// 錯誤
- (instancetype)initwithName:(NSString *)name {
self = [super init]; // 可能調用到錯誤的 super 方法
if (self) { _name = name; }
return self;
}
// 正確
- (instancetype)initWithName:(NSString *)name {
self = [super init]; // 呼叫父類指定初始化器
if (self) {
_name = [name copy];
}
return self;
}
init 開頭,首字母大寫(initWith...)。[super init] 或父類對應的指定初始化器。self.init... 本類其他初始化器。
instancetype 而非 id。if (self = [super init]) 模式確保父類初始化成功再初始化子類屬性。copy 修飾 NSString/NSArray 等不可變類型。release,但初始化失敗路徑(self = nil)需正確處理。