web-dev-qa-db-ja.com

「コンビニエンスイニシャライザーに別のイニシャライザーへの「自己」呼び出しがありません」

コードをiOS8プロジェクトに変換しようとしていますが、この警告を修正する方法について説明が必要です:"Convenience initializer missing a 'self' call to another initializer"

このコードについて:

-(instancetype) initWithCoder:(NSCoder *)aDecoder // warning: Convenience initializer missing a 'self ' call to another initializer
{
    if (self = [super initWithCoder:aDecoder]) // warning: convenience initializer should not invoke an initializer on 'super'
    {
    // some init stuff here
    }
    return self;
}
19
ignotusverum

Xcode 6に同梱されている新しいClangは、NS_DESIGNATED_INITIALIZERマクロを介してコンパイラーが強制する指定イニシャライザーを有効にします。クラスの宣言でinit-familyメソッドのいずれかをマークすると、他のすべての初期化子は「セカンダリ」(Appleの用語を使用するため)初期化子と見なされます。つまり、指定された初期化子に到達するまで、指定された初期化子またはセカンダリ初期化子を相互に呼び出す必要があります。

UIViewは指定された初期化子として何もマークしないため、どこかでクラスの別のinitメソッドを指定された初期化子として宣言しました。そのため、NSCoderの初期化子はセカンダリとしてマークされ、警告を生成します。私はそれについてレーダー(rdar:// 17559176)を提出しましたが、それまでは、_-Wno-objc-designated-initializers_を指定するか、適切な診断プッシュポップを_-Wobjc-designated-initializers_。

35
CodaFi

@CodaFiが言っていることへの単なる補遺:

  • 指定された初期化子で見つけたAppleドキュメントの1つのスライスは ここ です。
  • これらの警告を抑制する方法についての質問に回答しました ここ 、さらにいくつかのオプションがあります。プリコンパイル済みヘッダーメソッド(#2)は、修正するように促されるので、特に気に入っています。
4
Clay Bridges