Objective-C - это динамический язык. Прекрасно (во время компиляции) отправлять сообщение классу, который не реализует соответствующий метод. Вы также можете добавлять методы к классам во время выполнения! Objective-C позволит вам сойти с рук много вещей. Тем не менее, как правило, вам следует избегать такой практики, если только у вас нет для этого веских причин.
Как вы обнаружили, вы "можете" пропустить объявление методов в вашем .h файле, но это не рекомендуется. Зачем? Во-первых, если кто-то еще читает ваш код, может быть проще получить быстрый список всех реализованных методов. Во-вторых, если вы отлаживаете свой код и получаете сбой, скажем, objc_msgsend, когда объекту отправляется сообщение, на которое он не отвечает, вы можете легко отследить проблему, поскольку она возникнет как предупреждение в вашем код. Если вы всегда избегаете именования функций в своем файле .h, у вас будут сотни (тысячи?) Предупреждений, и будет непросто просмотреть их все.
Короче говоря, вы можете многим сойти с рук, но в целом вы должны следовать "хорошим" методам кодирования.