Все остальные ответы здесь устарели. Теперь есть способ сделать это правильно!
Несмотря на то, что во время выполнения легко вызвать сбой, когда кто-то вызывает ваш метод, проверка во время компиляции будет гораздо предпочтительнее.
К счастью, это было возможно в Objective-C некоторое время.
Используя LLVM, вы можете объявить любой метод недоступным в классе, например
- (void)aMethod __attribute__((unavailable("This method is not available")));
Это заставит компилятор жаловаться при попытке вызвать aMethod
. Отлично!
Поскольку - (id)init
- это обычный метод, вы можете запретить вызов инициализатора по умолчанию (или любого другого) таким способом.
Обратите внимание, однако, что это не застраховано от вызываемого метода с использованием динамических аспектов языка, например, через [object performSelector:@selector(aMethod)]
и т. Д. В случае init вы даже не будете получите предупреждение, потому что метод init определен в других классах, а компилятор не знает достаточно, чтобы дать вам необъявленное предупреждение селектора.
Итак, чтобы убедиться в этом, убедитесь, что при вызове метода init происходит сбой (см. Ответ Адама ).
Если вы хотите запретить - (id)init
в рамках, обязательно также запретите + (id)new
, так как это только перенаправит к init.
Джави Сото написал небольшой макрос, чтобы запретить использование назначенного инициализатора быстрее и проще и давать более приятные сообщения. Вы можете найти это здесь .