首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS OC 初始化報錯:initWith 方法名大小寫導致構造失敗

     編輯:程式設計綜合問答

問題現象

自定義初始化方法調用 [super init] 時報錯,編譯器提示「未找到初始化方法」或運行時崩潰。

根因

Objective-C 初始化方法慣例以 init 開頭,駝峰命名,如:

  • - (instancetype)init
  • - (instancetype)initWithFrame:(CGRect)frame
  • - (instancetype)initWithName:(NSString *)name age:(NSInteger)age

用戶代碼中寫成 initwith...(小寫 w),導致:

  1. 不符合編譯器對「指定初始化器」的識別規則。
  2. 父類 [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;
}

最佳實踐檢查清單

  1. 所有初始化方法以 init 開頭,首字母大寫(initWith...)。
  2. 指定初始化器(Designated Initializer)調用 [super init] 或父類對應的指定初始化器。
  3. 便利初始化器(Convenience Initializer)調用 self.init... 本類其他初始化器。
  4. 返回類型使用 instancetype 而非 id。
  5. if (self = [super init]) 模式確保父類初始化成功再初始化子類屬性。

ARC 環境下的注意點

  • 屬性用 copy 修飾 NSString/NSArray 等不可變類型。
  • 不再手動 release,但初始化失敗路徑(self = nil)需正確處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved