nac*_*o4d 5 cocoa objective-c objective-c-runtime
我正在尝试在Obj-c运行时引用中找到此方法
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)
Run Code Online (Sandbox Code Playgroud)
我想添加一个新的方法,如:
- [AClass drawWithFrame:(NSRect)rect inView:(id)view]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经编写了一个C函数:
void drawWithFrameInView(id this, SEL this_cmd, NSRect frame, id view){
...
}
Run Code Online (Sandbox Code Playgroud)
现在我准备做了:
BOOL success = class_addMethod(NSClassFromString(@"AClass"),
@selector(drawWithFrame:inView:),
(IMP)drawWithFrameInView,
"v@:@:@:");
Run Code Online (Sandbox Code Playgroud)
但是success从来没有,我尝试了同样的方法,使用更简单的签名方法,并且它有效.所以我认为问题是最后一个参数:"v@:@:@:"
在这种情况下我应该通过什么才能使我的新方法有效?
这将有效:
char *types = [[NSString stringWithFormat:@"v@:%s@", @encode(NSRect)] UTF8String];
BOOL success = class_addMethod(NSClassFromString(@"MyClass"),
@selector(drawWithFrame:inView:),
(IMP)drawWithFrameInView,
types);
Run Code Online (Sandbox Code Playgroud)
为什么你的代码不起作用的原因是因为NSRect是不是一个对象,它是一个typedef到struct.
在此处了解有关类型编码的更多信息.
| 归档时间: |
|
| 查看次数: |
2253 次 |
| 最近记录: |