NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Il s'agit d'une version courte de l'attribut indisponible. Il est apparu pour la première fois dans macOS 10.7 et iOS 5 . Il est défini dans NSObjCRuntime.h comme #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE.
Il existe une version qui désactive la méthode uniquement pour les clients Swift , pas pour le code ObjC:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Ajoutez l' unavailableattribut à l'en-tête pour générer une erreur du compilateur sur tout appel à init.
-(instancetype) init __attribute__((unavailable("init not available")));

Si vous n'avez pas de raison, tapez simplement __attribute__((unavailable)), ou même __unavailable:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Utilisez doesNotRecognizeSelector:pour déclencher une NSInvalidArgumentException. "Le système d'exécution appelle cette méthode chaque fois qu'un objet reçoit un message aSelector auquel il ne peut pas répondre ou le transférer."
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Utilisez NSAssertpour lancer NSInternalInconsistencyException et afficher un message:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Utilisez raise:format:pour lancer votre propre exception:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]est nécessaire car l'objet a déjà été allocaffecté. Lors de l'utilisation d'ARC, le compilateur l'appellera pour vous. Dans tous les cas, pas de quoi s'inquiéter lorsque vous êtes sur le point d'arrêter intentionnellement l'exécution.
objc_designated_initializer
Dans le cas où vous avez l'intention de désactiver initpour forcer l'utilisation d'un initialiseur désigné, il existe un attribut pour cela:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Cela génère un avertissement à moins qu'une autre méthode d'initialisation n'appelle en myOwnInitinterne. Les détails seront publiés dans Adopting Modern Objective-C après la prochaine version de Xcode (je suppose).
NS_UNAVAILABLE. Je vous exhorte généralement à utiliser cette approche. Le PO envisagerait-il de réviser sa réponse acceptée? Les autres réponses ici fournissent beaucoup de détails utiles, mais ne sont pas la méthode préférée pour y parvenir.