Краткий ответ: C.
Расширение: Когда компилятор генерирует вызов метода, он на самом деле просто генерирует вызов функции C - objc_msgSend () или ее варианта - который динамическисвязывает и отправляет метод.
Поскольку C ABI работает "в металле" (довольно близко), способ передачи аргументов и возвращаемых значений может существенно измениться в зависимости от типа.Например, компилятор может передавать в регистр что-либо размером до 32 бит (или 64 бит в некоторых архитектурах), но в стеке будет находиться что-то большее.
Из-за этого компилятор может:Необязательно генерировать универсальный бит сборки для вызова objc_msgSend () - для отправки вызова метода - через (id) в качестве разных сигнатур - разных типов аргументов метода - может потребоваться разная генерация кода.
Теперь, технически, компилятор может генерировать один и тот же код для многих случаев, но он предпочитает придерживаться консервативной политики и жаловаться.В частности, предполагается, что если у вас есть 2 конфликтующих типизированных объявления, могут быть и другие, которые напоминают вам, что использование метода с одним и тем же именем с различными типами аргументов крайне не рекомендуется.