Все еще не понимает динамическое связывание Objective-C - PullRequest
3 голосов
/ 27 февраля 2012

Вопрос из комментария, который я только что добавил к ответу на этот вопрос , но он не должен быть дубликатом.

Ответ @Bavarious на этот вопрос имеет для меня смысл, но я все еще не понимаю, почему среда выполнения не может привязать метод к нужному объекту, даже если объект является идентификатором? Насколько я понимаю, dynamic binding или dynamic typing заключается в том, что компилятор не может узнать, какой объект находится за идентификатором, но предполагается, что среда выполнения знает это и выбирает правильный объект в качестве получателя сообщения. но почему среда выполнения не может этого сделать?

1 Ответ

4 голосов
/ 27 февраля 2012

Краткий ответ: C.

Расширение: Когда компилятор генерирует вызов метода, он на самом деле просто генерирует вызов функции C - objc_msgSend () или ее варианта - который динамическисвязывает и отправляет метод.

Поскольку C ABI работает "в металле" (довольно близко), способ передачи аргументов и возвращаемых значений может существенно измениться в зависимости от типа.Например, компилятор может передавать в регистр что-либо размером до 32 бит (или 64 бит в некоторых архитектурах), но в стеке будет находиться что-то большее.

Из-за этого компилятор может:Необязательно генерировать универсальный бит сборки для вызова objc_msgSend () - для отправки вызова метода - через (id) в качестве разных сигнатур - разных типов аргументов метода - может потребоваться разная генерация кода.

Теперь, технически, компилятор может генерировать один и тот же код для многих случаев, но он предпочитает придерживаться консервативной политики и жаловаться.В частности, предполагается, что если у вас есть 2 конфликтующих типизированных объявления, могут быть и другие, которые напоминают вам, что использование метода с одним и тем же именем с различными типами аргументов крайне не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...