Могу ли я принять и обработать SEL в Objective-C как указатель на что-то? - PullRequest
5 голосов
/ 22 июня 2011

Я пытаюсь связать Lua с Objective-C, и я думаю, что преобразование строк с NSSelectorFromString() имеет слишком большие издержки, потому что Lua должен скопировать все строки, чтобы усвоить их (хотя я не уверен в этом).

Поэтому я пытаюсь найти более легкий способ представления селектора в Lua. Селектор Objective-C - это абстрагированный тип, но он определен как указатель на что-то:

typedef struct objc_selector    *SEL; 

Так что он выглядит безопасным для использования в качестве обычного указателя, поэтому я могу передать его Lua с помощью lightuserdata. Это нормально?

1 Ответ

2 голосов
/ 22 июня 2011

Я не верю, что безопасно обрабатывать его как указатель (даже указатель void), потому что, если это когда-либо изменится в будущей реализации или другой реализации языка. Я не видел формальной спецификации Objective-C, которая рассказывает, что определяет реализация, но часто, когда используются такие непрозрачные типы, это означает, что вам не нужно знать подробности о базовом типе. Фактически, структура объявлена ​​заранее, так что вы не можете получить доступ ни к одному из ее членов.

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

Использование C-строк, как указано выше, вероятно, является лучшим выбором; ruby удается использовать символы для селекторов и не слишком сильно снижает производительность. Поскольку строки const, lua не требуется для их копирования, но, вероятно, в любом случае они безопасны. Если вы можете найти способ не копировать строки, вы не сильно пострадаете от производительности.

...