NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Questa è la versione breve dell'attributo non disponibile. È apparso per la prima volta in macOS 10.7 e iOS 5 . È definito in NSObjCRuntime.h come #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE.
Esiste una versione che disabilita il metodo solo per i client Swift , non per il codice ObjC:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Aggiungi l' unavailableattributo all'intestazione per generare un errore del compilatore su qualsiasi chiamata a init.
-(instancetype) init __attribute__((unavailable("init not available")));

Se non hai un motivo, digita __attribute__((unavailable))o addirittura __unavailable:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Utilizzare doesNotRecognizeSelector:per generare un NSInvalidArgumentException. "Il sistema di runtime invoca questo metodo ogni volta che un oggetto riceve un messaggio aSelector al quale non può rispondere o inoltrare."
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Utilizzare NSAssertper generare NSInternalInconsistencyException e mostrare un messaggio:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Usa raise:format:per lanciare la tua eccezione:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]è necessario perché l'oggetto era già allocatato. Quando si utilizza ARC, il compilatore lo chiamerà per te. In ogni caso, non c'è nulla di cui preoccuparsi quando si sta per interrompere intenzionalmente l'esecuzione.
objc_designated_initializer
Nel caso in cui si desideri disabilitare initper forzare l'uso di un inizializzatore designato, esiste un attributo per questo:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Questo genera un avviso a meno che qualsiasi altro metodo di inizializzazione non venga chiamato myOwnInitinternamente. I dettagli saranno pubblicati in Adopting Modern Objective-C dopo la prossima versione di Xcode (credo).
NS_UNAVAILABLE. In generale, ti esorto a utilizzare questo approccio. L'OP prenderebbe in considerazione la revisione della risposta accettata? Le altre risposte qui forniscono molti dettagli utili, ma non sono il metodo preferito per raggiungere questo obiettivo.