Вернуться к исходному поведению sel getUid ()
TL; DR: Как проверить, что селектор с заданным именем был зарегистрирован, фактически не регистрируя его?
Спасибо!
Привет, у меня есть приложение Objective-C и куча NSObjects, которые экспортируются в состояние Lua через простую прокси-библиотеку, написанную в objc. Все вызовы Lua-стороны таковы:
exported_objc_object:myMethodName(...)
-- same as --
exported_objc_object.myMethodName(exported_objc_object, ...)
-- same as --
key = 'myMethodName'
exported_objc_object[key](exported_objc_object, ...)
Пересылаются так, как если бы кто-то позвонил:
[objc_object lua_myMethodName:L];
// declared as
- (int)lua_myMethodName:(lua_State *)L { ... }
На самом деле, любой код операции get на Lua-экспортированном объекте возвращает кэшированное Lua-закрытие, которое на вызов вызовет соответствующий метод Objective-C через селектор, построенный с sprintf(s, "lua_%s:", key))
&& sel_getUid(s)
(все чеки включены). Если произведенный селектор не реализован в терминах -[respondsToSelector:]
, то exported_objc_object.myMethodName
просто возвращает nil
.
Очевидно, что прокси-библиотека должна делать динамические запросы через sel_getUid()
или sel_registerName()
(я полагаю, что и @selector
и NSSelectorFromString()
также заканчиваются там). В руководстве говорится, что sel_getUid()
был предназначен для поиска имен селекторов (в отличие от немедленной регистрации их в реестре SEL), но это современный реализация теперь делает то же самое, что и sel_registerName()
из-за ошибок в чьем-то Teh codez тогда.
Я могу просто придерживаться поведения sel_registerName()
, но это оставляет вектор атаки поедания памяти, так как некоторые вредоносные скрипты могут начать искать длинные случайные/недопустимые селекторы через sml object[makeRandomKey()]
в цикле, таким образом, переполняя реестр SEL навсегда. Если sel_getUid()
сработает по плану, прокси lib сможет проверить наличие селектора и только потом реально проверить, реагирует ли на него объект, без излишней регистрации. Но это не делает.