В настоящее время библиотека времени выполнения Objective C не выполняет никаких проверок содержимого строки, которую вы пытаетесь зарегистрировать, и вряд ли команда разработчиков изменит это поведение.Если это непустая строка C, если вы всегда используете objc_msgSend
для отправки сообщений для этого селектора, и если вы не пытаетесь сделать что-то вроде [i4 +:i20]
(что приведет к ошибке компиляции), естьнет причин бояться.
Зарегистрированные селекторы Objective-C на самом деле являются строками C, хранящимися внутри системы времени выполнения.Система времени выполнения хранит таблицу указателей на строки C, так называемый набор SEL.Когда вы вызываете sel_registerName
, система времени выполнения ObjC вызывает strcmp
для вашей строки и для каждой строки C, хранящейся в наборе SEL.Если какая-либо из строк C в наборе SEL равна той, которую вы хотите зарегистрировать, функция возвращает адрес соответствующей строки C в наборе.В противном случае система дублирует вашу строку (с strdup
), сохраняет результирующий указатель в наборе SEL и возвращает его.Этот новый указатель становится новым уникальным селектором.