2011-06-16 66 views
0

我有我测试下面的代码:NSInvocation的setSelector抛出一个异常

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] 

我一直曳网寻找原因并找不到它。它看起来像试图设置将作为选择器的调用的第二个参数,但该数组不够长。我会认为调用的创建会设置数组。

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

+0

您能否提供aMethodWithNoParms方法声明? – Radu 2011-06-16 13:49:37

+0

尝试使用具有类似这样的参数的选择器方法 - (void)SetSelectorMethod:(id)sender – Radu 2011-06-16 13:51:51

回答

3

如果你的方法不返回任何东西,即它有一个void返回类型,那么你的方法的签名会,

NSString * parameterSignature = @"[email protected]:"; 

表明void返回类型,self_cmd

您应该优先使用methodSignatureForSelector:instanceMethodSignatureForSelector:来获取方法签名。

+0

啊,返回类型,这就是我错过的。谢谢。 – drekka 2011-06-17 05:00:01

3

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

"@@:" 

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

参见this discussion

+0

Ahh返回类型,这就是我错过的。谢谢。 – drekka 2011-06-17 04:59:48