在编译时将选择器转换为其class_addMethod()编码

时间:2012-12-18 01:06:38

标签: objective-c encode

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

/* This category is declared here but not defined anywhere.
 * It lets me write
 *   id MyNewClass = objc_lookUpClass("MyNewClass");
 *   [MyNewClass class_method];
 * without spurious compiler warnings.
 */
@interface NSObject (MyNewClass)
+(void) class_method;
+(void) class_method_taking_int: (int) f;
-(int) method_returning_int: (int) i;
@end

...
{
    Class MyNewClass = objc_allocateClassPair([NSObject class], "MyNewClass", 0);
    Class MyNewClass_meta = object_getClass(cls);
    class_addMethod(MyNewClass_meta, @selector(class_method),
        (IMP)..., "v@:");
    class_addMethod(MyNewClass_meta, @selector(class_method_taking_int:),
        (IMP)..., "v@:i");
    class_addMethod(MyNewClass, @selector(method_returning_int:),
        (IMP)..., "i@:i");
    objc_registerClassPair(MyNewClass);
}

我希望能够消除所有那些文字"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_addMethod所期望的字符串格式与@encode(foo)返回的字符串格式不同,实际上@encode(foo)无法编码函数类型 - 它只返回"?""^?"。所以我想我不能逐字地使用@encode

但是我可以做什么吗?

0 个答案:

没有答案