我在测试工具中有以下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
。
但是我可以做什么吗?