在Objective-C中使用两个以上的参数执行动态类方法调用

Ric*_*ick 4 cocoa objective-c ios

我有一个方法可以动态创建不同类的新对象,并希望能够在创建这些类时对这些类执行选择.使用performSelector: withObject:会工作,但方法有四个参数.我使用NSInvocation尝试了以下代码,但是有一个错误,它是一个无法识别的选择器.

NSInvocation *call = [NSInvocation invocationWithMethodSignature:[NSClassFromString(className) methodSignatureForSelector:@selector(packWithName:value:writer:forClass:)]];
[call setArgument:&arg1 atIndex:0];
[call setArgument:&arg2 atIndex:1];
[call setArgument:&arg3 atIndex:2];
[call setArgument:&arg4 atIndex:3];
call.target = NSClassFromString(className);
[call invoke];
Run Code Online (Sandbox Code Playgroud)

它还会生成以下日志语句:

*** NSForwarding: warning: selector (0x8ed78d0) for message '[garbled random characters]'
does not match selector known to Objective C runtime (0x8b0cd30)-- abort
Run Code Online (Sandbox Code Playgroud)

我还尝试使用alloc/init创建NSInvocation并设置@selector如下:

NSInvocation *call = [[NSInvocation alloc] init];
call.selector = @selector(nameofselector);
Run Code Online (Sandbox Code Playgroud)

然而,这会导致call为零,所以我想这是不允许的.

我是否遗漏了有关NSInvocation如何工作的内容或者有更聪明的方法来做到这一点?

小智 6

索引0和1处的参数不是方法调用的前两个显式参数,而是隐式self_cmd参数.请使用索引2,3,4和5.