Понять Objective-C во время выполнения - PullRequest
2 голосов
/ 20 февраля 2012

Я читал о том, как работает Objective-C, поэтому, пожалуйста, прокомментируйте, если я что-то неправильно понял.

Допустим, у меня есть класс под названием Person. Этот класс может иметь или не иметь метод getSex.

Person *p = [[Person alloc]init];

Здесь память выделяется для экземпляра Person (также создается isa, который указывает на класс Person), init используется для инициализации персоны ivar

[p getSex];

Здесь objc_msgSend (Person, @ selector (getSex) вызывается для класса Person. Если у класса Person нет такого метода, среда выполнения ищет этот метод в корневом классе Person и так далее. Когда метод найден, вызывается IMP, который является указателем на код блока метода. Затем метод выполняется.

Это правильно?

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Да, все правильно, за исключением того, что поведение init может или не может инициализировать все его переменные-члены, так что методы доступа возвращают действительные результаты, хотя разумно предположить, что он инициализирует свойства, если не указано иное.

0 голосов
/ 18 февраля 2013

Есть одна часть, которая немного отключена.

На самом деле вызов будет одним из этих трех:

objc_msgSend(p, @selector(getSex))
objc_msgSend_fpret(p, @selector(getSex))
objc_msgSend_stret(p, @selector(getSex))

Одно из различий состоит в том, что первый аргумент относится к объекту, а не кthe class.

Кроме того, поскольку вы не поделились тем, что возвращает метод getSex, мы не можем знать, будет ли это одна из версий fpret / stret или нет.Если метод возвращает значение double (на определенных платформах), будет использоваться версия fpret.Если метод возвращает структурное значение (на определенных платформах), то будет использоваться версия stret.Все остальные будут использовать стандартную версию.Все это зависит от платформы многими различными способами.

Как уже говорили другие, при выделении будут созданы объекты со всеми переменными экземпляра, установленными на 0 / NULL, а также действительный указатель isa.Методы инициализации могут или не могут обновлять переменные экземпляра с чем-то значимым.

...