NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Esta é a versão curta do atributo indisponível. Ele apareceu pela primeira vez no macOS 10.7 e iOS 5 . É definido em NSObjCRuntime.h como #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
.
Existe uma versão que desativa o método apenas para clientes Swift , não para o código ObjC:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Adicione o unavailable
atributo ao cabeçalho para gerar um erro do compilador em qualquer chamada para init.
-(instancetype) init __attribute__((unavailable("init not available")));

Se você não tiver um motivo, basta digitar __attribute__((unavailable))
ou até __unavailable
:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Use doesNotRecognizeSelector:
para gerar uma NSInvalidArgumentException. "O sistema de tempo de execução chama esse método sempre que um objeto recebe uma mensagem aSelector que não pode responder ou encaminhar."
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Use NSAssert
para lançar NSInternalInconsistencyException e mostrar uma mensagem:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Use raise:format:
para lançar sua própria exceção:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]
é necessário porque o objeto já foi alloc
atado. Ao usar o ARC, o compilador o chamará para você. De qualquer forma, não é algo para se preocupar quando você está prestes a parar intencionalmente a execução.
objc_designated_initializer
Caso você pretenda desativar init
para forçar o uso de um inicializador designado, há um atributo para isso:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Isso gera um aviso, a menos que qualquer outro método inicializador chame myOwnInit
internamente. Os detalhes serão publicados em Adotting Modern Objective-C após o próximo lançamento do Xcode (eu acho).
NS_UNAVAILABLE
. Geralmente, exorto você a usar essa abordagem. O OP consideraria revisar sua resposta aceita? As outras respostas aqui fornecem muitos detalhes úteis, mas não são o método preferido para conseguir isso.