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

标签 ios objective-c cocoa

我有一个方法可以动态创建不同类的新对象,并希望能够在创建这些类时对其执行选择器。使用 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];

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

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

我还尝试使用 alloc/init 创建 NSInvocation 并像这样设置 @selector:

NSInvocation *call = [[NSInvocation alloc] init];
call.selector = @selector(nameofselector);

然而,这会导致 call 为 nil,所以我猜这是不允许的。

我是否遗漏了有关 NSInvocation 工作原理的信息,或者是否有更智能的方法来做到这一点?

最佳答案

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

关于ios - 使用两个以上的参数在 Objective-C 中执行动态类方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17923828/

相关文章:

Objective-C:将两个整数相除并返回一个四舍五入的整数值

ios - 使用 Objective-C 和 Swift 创建内存泄漏

objective-c - Mac - 获取电池/充电状态(插入或未插入)

objective-c - 高效访问众多 Cocoa 控件

ios - AIR for iOS 中的输入文本字段中没有抗锯齿功能

ios - 如何使用手势识别器在大图像上画线而不会出现内存问题

ios - 为什么在选择日期之前 UIDatePicker 的颜色设置不会激活?

objective-c - 重用从文件读取的代码仅在第二类中导致 EXC_BAD_ACCESS

ios - UIAttachmentBehavior 不起作用。 UIDynamicAnimator

objective-c - Objective-C 中的属性和实例变量