Введите строку кодирования для метода протокола - PullRequest
4 голосов
/ 10 января 2012

Я пытаюсь получить подпись - либо объект NSMethodSignature, либо, по крайней мере, строку кодирования типа - для метода, объявленного в протоколе.

Запрос самого объекта Protocol isnэто невозможно, поскольку а) он не реализует methodSignatureForSelector:, а б) (как отмечено Кевином ниже) устарел.

Функция времени выполнения protocol_getMethodDescription возвращает struct objc_method_description, что не 'T описано где-нибудь в документах.Хотя в публичном заголовке - :

struct objc_method_description {
    SEL name;
    char *types;
};

Представляется разумным предположить, что строка types там будет того же типа строки кодирования подписи, используемой в другом месте, как та, которую ожидает +[NSMethodSignature signatureWithObjCTypes:], идействительно, это выглядит правильно.

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

Я не могуПодумайте, что еще было бы, но все же, есть ли у меня основания полагать, что эта строка types действительна для взаимодействия с другими объектами / функциями в том же времени выполнения ?Обратите внимание, что я сам не пишу строки кодирования и не ожидаю, что они будут иметь заданный формат или значение - я только хочу передать их из одной части среды выполнения / фреймворка в другую, то есть получить строку кодирования из протокола и) использовать его для создания объекта NSMethodSignature, если он недоступен, и, возможно, б) сравнить его с объектом, сгенерированным во время выполнения NSInvocation (т. е. в -forwardInvocation:).

1 Ответ

5 голосов
/ 10 января 2012

Использование Protocol в качестве объекта устарело. Если вы проверите заголовок <objc/Protocol.h>, вы увидите, что почти все на нем либо недоступно в OBJC-2, либо устарело с OS X 10.5. Что вы можете сделать, это использовать protocol_getMethodDescription(), как вы предложили, и вытащить поле types. Я не уверен, официально ли это задокументировано, что это кодировка типа метода, но это действительно так.

...