我正在测试以下代码:
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 :(得分:3)
我认为C字符串的第一个字符应该是返回类型。所以它应该是
"@@:"
如果方法返回一个对象。您的字符串定义了一个返回类型为object的方法和一个作为选择器的参数。实际上,您至少需要返回类型,接收器类型和选择器类型。
请参阅this discussion。
答案 1 :(得分:3)
如果您的方法没有返回任何内容,即它具有void
返回类型,那么您的方法签名将是,
NSString * parameterSignature = @"v@:";
表示void
返回类型,self
和_cmd
。
您最好使用methodSignatureForSelector:
或instanceMethodSignatureForSelector:
来获取方法签名。