Objective c 在编译时将选择器转换为其类\u addMethod()编码
对于一些疯狂的低级代码(不要问),我在测试工具中有以下Objective-C代码: 我希望能够消除所有那些字面的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
“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:])));