Objective c 在编译时将选择器转换为其类\u addMethod()编码

Objective c 在编译时将选择器转换为其类\u addMethod()编码,objective-c,encode,Objective C,Encode,对于一些疯狂的低级代码(不要问),我在测试工具中有以下Objective-C代码: 我希望能够消除所有那些字面的“v@:I”等等。毕竟,这些应该只是NSObject(MyNewClass)类别中列出的方法签名的编码。所以我觉得我应该能写一些 class_addMethod(MyNewClass_meta, @selector(class_method_taking_int:), (IMP)..., @encode(__typeof__(+[NSObject class_m

对于一些疯狂的低级代码(不要问),我在测试工具中有以下Objective-C代码:

我希望能够消除所有那些字面的
“v@:I”
等等。毕竟,这些应该只是
NSObject(MyNewClass)
类别中列出的方法签名的编码。所以我觉得我应该能写一些

    class_addMethod(MyNewClass_meta, @selector(class_method_taking_int:),
        (IMP)..., @encode(__typeof__(+[NSObject class_method_taking_int:])));
当然,上面的语法是虚构的,但是Objective-C中不应该有这样的东西吗?然后我可以把整个事情隐藏在一个简单的宏后面,代码会很漂亮

请注意,我不能使用
methodSignatureForSelector
,因为这假设我有一个响应给定选择器的对象,而我没有,因为我还没有注册我的类

还要注意的是,
class\u addMethod
所期望的字符串格式与
@encode(foo)
返回的字符串格式不同,事实上,
@encode(foo)
根本不能对函数类型进行编码-它只会返回
“?”
“^?”
。所以我想我不能直接使用
@encode


但是我能做些什么吗?

没有对你的问题进行详细的研究。。。您能否立即通过
nsselector或fromstring(@“unregisteredSelector”)
查询选择器以将方法签名分离开来。。。甚至在“注册”之前。@alexgray我不明白你的意思,抱歉。(考虑发布一个较长的答案,如果您愿意,您可以稍后删除:)
NSSelectorFromString(@“unregisteredSelector”)
完全等同于
@selector(unregisteredSelector)
;它仍然没有告诉我这个方法的签名。(回想一下,选择器与方法不是一回事。)但也值得注意的是,我个人已经有六个月没有使用Objective-C了;当然,其他读者可能希望看到问题的答案,但我个人不再投资于这个问题。
    class_addMethod(MyNewClass_meta, @selector(class_method_taking_int:),
        (IMP)..., @encode(__typeof__(+[NSObject class_method_taking_int:])));