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 (я полагаю).