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@:@:@:"
在这种情况下我应该通过什么才能使我的新方法有效?
答案 0 :(得分:8)
这将有效:
char *types = [[NSString stringWithFormat:@"v@:%s@", @encode(NSRect)] UTF8String];
BOOL success = class_addMethod(NSClassFromString(@"MyClass"),
@selector(drawWithFrame:inView:),
(IMP)drawWithFrameInView,
types);
您的代码不起作用的原因是因为NSRect
不是对象 ,它是typedef
到struct
1}}。
详细了解类型编码here。