NS_UNAVAILABLE
- (instancetype)init NS_UNAVAILABLE;
Это краткая версия недоступного атрибута. Впервые он появился в macOS 10.7 и iOS 5 . Это определяется в NSObjCRuntime.h как #define NS_UNAVAILABLE UNAVAILABLE_ATTRIBUTE
.
Существует версия, которая отключает метод только для клиентов Swift , но не для кода ObjC:
- (instancetype)init NS_SWIFT_UNAVAILABLE;
unavailable
Добавьте unavailable
атрибут в заголовок, чтобы сгенерировать ошибку компилятора при любом вызове init.
-(instancetype) init __attribute__((unavailable("init not available")));
Если у вас нет причины, просто введите __attribute__((unavailable))
или даже __unavailable
:
-(instancetype) __unavailable init;
doesNotRecognizeSelector:
Используйте, doesNotRecognizeSelector:
чтобы вызвать NSInvalidArgumentException. «Система времени выполнения вызывает этот метод всякий раз, когда объект получает сообщение aSelector, на которое он не может ответить или переслать».
- (instancetype) init {
[self release];
[super doesNotRecognizeSelector:_cmd];
return nil;
}
NSAssert
Используйте, NSAssert
чтобы бросить NSInternalInconsistencyException и показать сообщение:
- (instancetype) init {
[self release];
NSAssert(false,@"unavailable, use initWithBlah: instead");
return nil;
}
raise:format:
Используйте, raise:format:
чтобы создать собственное исключение:
- (instancetype) init {
[self release];
[NSException raise:NSGenericException
format:@"Disabled. Use +[[%@ alloc] %@] instead",
NSStringFromClass([self class]),
NSStringFromSelector(@selector(initWithStateDictionary:))];
return nil;
}
[self release]
необходимо, потому что объект уже alloc
съел. При использовании ARC его вызовет компилятор. В любом случае не о чем беспокоиться, когда вы собираетесь намеренно прекратить исполнение.
objc_designated_initializer
Если вы намереваетесь отключить init
принудительное использование назначенного инициализатора, для этого есть атрибут:
-(instancetype)myOwnInit NS_DESIGNATED_INITIALIZER;
Это генерирует предупреждение, если какой-либо другой метод инициализатора не вызывает myOwnInit
внутренне. Подробности будут опубликованы в « Принятии Modern Objective-C» после следующего выпуска Xcode (я думаю).
NS_UNAVAILABLE
. Как правило, я призываю вас использовать этот подход. Рассмотрит ли ФП пересмотр принятого ответа? Другие ответы здесь предоставляют много полезных деталей, но не являются предпочтительным методом достижения этого.