动态添加方法

时间:2011-07-25 05:16:52

标签: objective-c cocoa objective-c-runtime

我正在Obj-c runtime reference

中尝试此方法
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

我想添加一个新方法,如:

- [AClass drawWithFrame:(NSRect)rect inView:(id)view]

到目前为止,我已经编写了一个C函数:

void drawWithFrameInView(id this, SEL this_cmd, NSRect frame, id view){
...
} 

现在我准备好了:

BOOL success = class_addMethod(NSClassFromString(@"AClass"), 
                               @selector(drawWithFrame:inView:), 
                               (IMP)drawWithFrameInView, 
                               "v@:@:@:");

但是success永远不会是,我尝试了使用更简单签名的方法的相同方法,并且它有效。所以我认为问题是最后一个参数:"v@:@:@:"

在这种情况下我应该通过什么才能使我的新方法有效?

1 个答案:

答案 0 :(得分:8)

这将有效:

char *types = [[NSString stringWithFormat:@"v@:%s@", @encode(NSRect)] UTF8String];

BOOL success = class_addMethod(NSClassFromString(@"MyClass"), 
                               @selector(drawWithFrame:inView:), 
                               (IMP)drawWithFrameInView, 
                               types);

您的代码不起作用的原因是因为NSRect 不是对象 ,它是typedefstruct 1}}。

详细了解类型编码here