动态添加方法

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@:@:@:"

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

Jac*_*kin 8

这将有效:

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不是一个对象,它是一个typedefstruct.

在此处了解有关类型编码的更多信息.

  • 我很失望"@encode(...)`不被视为文字.如果是,你可以在编译时连接它们:`static const char types [] = @encode(void)@encode(id)@encode(SEL)@encode(NSRect)@encode(id);` (2认同)