Избегать накладных расходов на функцию objmsg? - PullRequest
3 голосов
/ 17 марта 2011

Можем ли мы избежать накладных расходов на функцию objmsg, используя селекторы и селекторы средств и указатель реализации. Пожалуйста, расскажите, как этого можно избежать?

Ответы [ 3 ]

5 голосов
/ 17 марта 2011
// first, access the SELector you're interested in (example)
SEL sel = @selector(<#SOMETHING#>);

// this is the definition of IMP
id (*IMP)(id, SEL, ...);

получить доступ к IMP для экземпляра определенного класса, используя: + (IMP)instanceMethodForSelector:(SEL)aSelector;

в идеале вы приведете результат instanceMethodForSelector: к точному typedef вызываемой функции, чтобы компилятор мог правильно понять sig.

когда у вас есть объект SEL и IMP, затем используйте IMP в качестве обычного указателя на функцию C.

, где первое возвращаемое сообщение функции IMP является объектом (= self), а второй аргумент является селектором (= _cmd). это 2 скрытых аргумента объекта.

1 голос
/ 17 марта 2011

Единственный серьезный ответ на этот вопрос:

Используйте что-то кроме Objective-C

Честно говоря, любой способ избежать obj_msg_send() гарантированно будет хрупкими, вероятно, сэкономит вам наносекунды за звонок.Если у вас есть очень короткая функция, которая вызывается очень часто, то вам, вероятно, следует просто использовать C, чтобы переопределить эту функцию.Почти во всех других случаях это не стоит беспокоиться.

1 голос
/ 17 марта 2011

Я предполагаю, что ваше требование является результатом профилирования, а не случаем преждевременной оптимизации.

1) Вы можете получить реализацию метода (см. Ответ Джастина).Чтобы уточнить - нет больших накладных расходов в objc_msgSend.Большую часть времени он будет проверять nil значение self, искать IMP в кеше и выполнять конечный вызов IMP (http://www.friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map/).Если вы хотите сохранить эти несколько инструкций, то ...

2) ... напишите свою функцию на C с самого начала.Это гораздо более читаемое и надежное решение.

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