Во всех ответах пока отсутствует актуальная точка вопроса. Это было не «могу ли я переопределить методы», это было «могу ли я заставить компилятор сказать мне, когда то, что я считаю переопределением, на самом деле ничего не переопределяет».
К сожалению, ответ на вопрос - нет. На момент написания этой статьи у ObjC не было способа аннотировать метод как явное переопределение метода базового класса.
Из-за динамической диспетчеризации невозможно получить точный эквивалент тому, что есть в C #, C ++ и Java. Динамическая диспетчеризация означает, что практически все объекты отвечают на все сообщения, просто иногда этот ответ вызывает исключение. И то, как реагирует какое-либо конкретное сообщение, может динамически изменяться во время выполнения. Таким образом, компилятор не может сказать вам во время компиляции со 100% уверенностью, будет ли какой-либо конкретный метод иметь обработчик не по умолчанию во время выполнения.
Теперь, несмотря на это, я никогда не писал компилятор ObjC, но теоретически я думаю, что компилятор мог бы проверить метод, который вы объявляете как переопределение, против статически объявленных сигнатур методов во всех базовых классах. Именно так написано подавляющее большинство кода ObjC, с явно выраженными сигнатурами методов, статически записанными в объявлениях @interface. Таким образом, вы могли бы иметь аннотацию типа NS_INTERFACE_OVERRIDE, которая требует, чтобы некоторый базовый класс текущего класса имел ту же сигнатуру, явно объявленную в разделе @interface.