2011-06-16 298 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