NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Esta es una versión corta del atributo no disponible. Apareció por primera vez en macOS 10.7 y iOS 5 . Se define en NSObjCRuntime.h como #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
.
Hay una versión que deshabilita el método solo para clientes Swift , no para el código ObjC:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Agregue el unavailable
atributo al encabezado para generar un error del compilador en cualquier llamada a init.
-(instancetype) init __attribute__((unavailable("init not available")));
Si no tiene una razón, simplemente escriba __attribute__((unavailable))
, o incluso __unavailable
:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Se usa doesNotRecognizeSelector:
para generar una NSInvalidArgumentException. "El sistema de tiempo de ejecución invoca este método cada vez que un objeto recibe un mensaje aSelector al que no puede responder o reenviar".
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Use NSAssert
para lanzar NSInternalInconsistencyException y mostrar un mensaje:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Use raise:format:
para lanzar su propia excepción:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]
es necesario porque el objeto ya estaba alloc
alterado. Cuando use ARC, el compilador lo llamará por usted. En cualquier caso, no es algo de lo que preocuparse cuando está a punto de detener intencionalmente la ejecución.
objc_designated_initializer
En caso de que tenga la intención de deshabilitar init
para forzar el uso de un inicializador designado, hay un atributo para eso:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Esto genera una advertencia a menos que cualquier otro método inicializador llame myOwnInit
internamente. Los detalles se publicarán en Adopting Modern Objective-C después del próximo lanzamiento de Xcode (supongo).
NS_UNAVAILABLE
. En general, le recomiendo que utilice este enfoque. ¿El OP consideraría revisar su respuesta aceptada? Las otras respuestas aquí proporcionan muchos detalles útiles, pero no son el método preferido para lograrlo.