NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Dies ist die Kurzversion des nicht verfügbaren Attributs. Es erschien zuerst in macOS 10.7 und iOS 5 . Es ist in NSObjCRuntime.h als definiert #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
.
Es gibt eine Version, die die Methode nur für Swift-Clients deaktiviert , nicht für ObjC-Code:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Fügen Sie das unavailable
Attribut dem Header hinzu, um bei jedem Aufruf von init einen Compilerfehler zu generieren .
-(instancetype) init __attribute__((unavailable("init not available")));
Wenn Sie keinen Grund haben, geben Sie einfach ein __attribute__((unavailable))
oder sogar __unavailable
:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Verwenden Sie doesNotRecognizeSelector:
diese Option, um eine NSInvalidArgumentException auszulösen. "Das Laufzeitsystem ruft diese Methode immer dann auf, wenn ein Objekt eine aSelector-Nachricht empfängt, auf die es nicht antworten oder die er nicht weiterleiten kann."
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Verwenden Sie NSAssert
diese Option, um NSInternalInconsistencyException auszulösen und eine Nachricht anzuzeigen:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Verwenden Sie raise:format:
diese Option, um Ihre eigene Ausnahme auszulösen:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]
wird benötigt, weil das Objekt bereits alloc
bearbeitet wurde. Wenn Sie ARC verwenden, ruft der Compiler es für Sie auf. Auf jeden Fall kein Grund zur Sorge, wenn Sie die Ausführung absichtlich beenden möchten.
objc_designated_initializer
Falls Sie init
die Verwendung eines bestimmten Initialisierers deaktivieren möchten, gibt es dafür ein Attribut:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Dies generiert eine Warnung, es sei denn, eine andere Initialisierungsmethode ruft myOwnInit
intern auf. Details werden nach der nächsten Xcode-Veröffentlichung in Adopting Modern Objective-C veröffentlicht (denke ich).
NS_UNAVAILABLE
. Ich möchte Sie generell dringend bitten, diesen Ansatz zu verwenden. Würde das OP erwägen, seine akzeptierte Antwort zu überarbeiten? Die anderen Antworten hier liefern viele nützliche Details, sind jedoch nicht die bevorzugte Methode, um dies zu erreichen.