2013-10-23 67 views
0

我遇到以下問題。使用NSInvocation setArgument:從NSArray返回的值

我有一個NSArray的值,我需要循環並設置內容作爲NSInvocation對象的各自的參數。請看下面的代碼:

NSArray *args = @[@"test"]; 

後來我想這樣做:

for (i = 0; i < [args count]; i++) 
{ 
    [invocationObj setArgument: [args objectAtIndex: i] atIndex: i+2]; 
} 

但這不起作用。它提供了以下警告:

Implicit conversion of Objective-C pointer type 'id' to C pointer type 'void *' requires a bridged cast 

調用對象是動態的(兩個目標/選擇器和參數),所以我不知道什麼時候我設置了相應的invocationObj的參數args數組的內容。有什麼辦法可以做到這一點?

+0

您在**調用調用之前設置了參數**。 – 2013-10-23 15:17:38

+1

你的問題到底是什麼? – RyanR

+2

「不起作用」是什麼意思?給編譯器錯誤?信號?例外?分配或調用?發送錯誤的參數?不發送消息? – Kevin

回答

3

您需要將指針位置傳遞給setArgument:atIndex:。具體地,該部分從所述文檔

當參數值是一個對象,將指針傳遞給從該物體應被複制的變量(或存儲器):

因此,嘗試這個..

id argument = [args objectAtIndex: i]; 
[invocationObj setArgument:&argument atIndex: i+2]; 
+0

是的,對不起。我不是說他們是一樣的。只是setArguments接受void *,其中的id是其子集。刪除了這一點要清楚。 –

+0

非常感謝!一個問題,但。爲什麼我不能這樣做:[invocationObj setArgument:&[args objectAtIndex:i] atIndex:i + 2]; ?? – BIOS

+3

因爲編譯器不允許r值表達式的地址操作。更多解釋在這裏:http://stackoverflow.com/a/7370156/98048 –