Die Verwendung von NS_DESIGNATED_INITIALIZER
schön in http://useyourloaf.com/blog/2014/08/19/xcode-6-objective-c-modernization.html erklärt:
The designated initializer guarantees the object is fully initialised by sending an initialization message to the superclass. The implementation detail becomes important to a user of the class when they subclass it. The rules for designated initializers in detail:
- A designated initializer must call (via super) a designated initializer of the superclass. Where NSObject is the superclass this is just [super init].
- Any convenience initializer must call another initializer in the class - which eventually leads to a designated initializer.
- A class with designated initializers must implement all of the designated initializers of the superclass.
Als Beispiel, wenn Ihre Schnittstelle ist
@interface MyClass : NSObject
@property(copy, nonatomic) NSString *name;
-(instancetype)initWithName:(NSString *)name NS_DESIGNATED_INITIALIZER;
-(instancetype)init;
@end
dann der Compiler prüft, ob die (Bequemlichkeit) initializer init
ruft die (bezeichnet) Initialisierer initWithName:
, so würde dies eine Warnung verursachen:
-(instancetype)init
{
self = [super init];
return self;
}
und das wäre in Ordnung sein:
-(instancetype)init
{
self = [self initWithName:@""];
return self;
}
In Swift die Regeln über bezeichnet und Bequemlichkeit initializers sind noch strenger, und wenn Sie Objective-C und Swift Code mischen, Kennzeichnung der benannten Ziel -C-Initialisierer helfen dem Compiler, die Regeln zu erzwingen.
Zum Beispiel dieser Swift Unterklasse würde einen Compiler-Fehler verursachen:
class SwClass: MyClass {
var foo : String
init(foo : String) {
self.foo = foo
super.init()
}
}
und das wäre in Ordnung sein:
class SwClass: MyClass {
var foo : String
init(foo : String) {
self.foo = foo
super.init(name: "")
}
}
Es ist nicht sehr gut durch Konzept gedacht, in Objective-C, weil 'initWithName: @„“' nicht immer sinnvoll ist, wenn Subklassifizieren. Statt normalerweise außer Kraft gesetzt bestimmte Initialisierung von Super wirft Ausnahme sollte verwenden bestimmte Initialisierung von Unterklasse zu sagen. – Andy
Martins Antwort hinzuzufügen, Sie möchten die Benutzer rufen die Standard initialisers vollständig zu unterdrücken, in dem Fall, dass Sie die folgende verwenden: - (instanceType) NS_UNAVAILABLE init; –