2014-06-27 8 views
18

Ich versuche, meinen Code zu iOS 8-Projekt konvertieren, und ich brauche eine Erklärung darüber, wie diese Warnung zu beheben: "Convenience initializer missing a 'self' call to another initializer"„Convenience initializer einen‚Selbst‘Anruf an einem anderen initializer fehlt“

auf diesem Code:

+1

aus welcher Klasse erbt diese Klasse? –

+0

erbt von Uiview – ignotusverum

+1

Und es ist IMO gutes Verhalten, diese Zuordnung aus if-Anweisung zu verschieben. –

Antwort

31

Der neue Clang-Versand mit Xcode 6 ermöglicht durch den NS_DESIGNATED_INITIALIZER-Makro durch den Compiler erzwungene benannte Initialisierer. Wenn in der Deklaration einer Klasse eine der Methoden der Init-Familie markiert wird, werden alle anderen Initialisierer als "sekundär" (um die Terminologie von Apple zu verwenden) als Initialisierer betrachtet. Das heißt, sie sollten sich gegenseitig zu einem bestimmten oder sekundären Initialisierer aufrufen, bis sie einen bestimmten Initialisierer erreichen.

UIView markiert nichts als den designierten Initialisierer, also haben Sie irgendwo eine andere init-Methode der Klasse als designierten Initialisierer deklariert. Aus diesem Grund wird NSCoders Initialisierer als sekundär markiert und generiert eine Warnung. Ich habe ein Radar (rdar: // 17559176) darüber abgelegt, aber bis dahin kann es pro Datei deaktiviert werden, indem -Wno-objc-designated-initializers angegeben wird, oder indem das entsprechende Diagnose-Push-Pop mit -Wobjc-designated-initializers bereitgestellt wird.

+2

Ab mindestens iOS SDK 9.2, beide UIView -initWithFrame: und -initWithCoder: beide NS_DESIGNATED_INITIALIZER markiert sind. – bleater

3

nur eine Ergänzung zu dem, was @CodaFi sagt:

  • Eine Scheibe von Apple docs ich auf ausgewiesenen initializers gefunden ist here.
  • Ich habe eine Frage beantwortet, wie diese Warnungen here, mit ein paar mehr Optionen zu unterdrücken. Ich mag besonders die vorkompilierte Header-Methode (# 2), weil sie Sie daran erinnert, sie zu beheben.
Verwandte Themen