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
. Я б закликав вас використовувати цей підхід. Чи розглядає ОП перегляд їх прийнятої відповіді? Інші відповіді тут містять багато корисних деталей, але не є кращим методом досягнення цього.