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' unavailable
attribut à 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 NSAssert
pour 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é alloc
affecté. 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 init
pour 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 myOwnInit
interne. 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.