NSInvocation setSelector抛出异常

时间:2011-06-16 13:42:39

标签: objective-c runtime

我正在测试以下代码:

NSString * parameterSignature = @"@:";
NSMethodSignature * signature = [NSMethodSignature signatureWithObjCTypes:[parameterSignature UTF8String]]; 
NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:@selector(aMethodWithNoParms)];

当setSelector执行时,我收到此错误:

Name: NSInvalidArgumentException
File: Unknown
Line: Unknown
Reason: -[NSInvocation setArgument:atIndex:]: index (1) out of bounds [-1, 0]

我一直在寻找网络寻找原因而没有找到它。看起来它试图设置调用的第二个参数,它将是选择器,但是数组不够长。我原以为创建调用会设置数组。

我不知道如何解决这个问题,任何人都会看到我做错了什么?

2 个答案:

答案 0 :(得分:3)

我认为C字符串的第一个字符应该是返回类型。所以它应该是

"@@:"

如果方法返回一个对象。您的字符串定义了一个返回类型为object的方法和一个作为选择器的参数。实际上,您至少需要返回类型,接收器类型和选择器类型。

请参阅this discussion

答案 1 :(得分:3)

如果您的方法没有返回任何内容,即它具有void返回类型,那么您的方法签名将是,

NSString * parameterSignature = @"v@:";

表示void返回类型,self_cmd

您最好使用methodSignatureForSelector:instanceMethodSignatureForSelector:来获取方法签名。