0

我有下面簽名的方法:從NSInvocation的獲取對象數組參數與ARC

- (void)takeIntsAndRecieveIntsAsync:(MyInt *__strong []) 
         completion:(void (^)(MyInt * __strong response[]))success; 

我有幾個問題:

1.如何檢索使用NSInvocation的在論證這種方法?

- (void)forwardInvocation:(NSInvocation *)invocation 

我嘗試以下,但我沒有得到正確的值:

__unsafe_unretained MyInt *a[2]; 
[invocation getArgument:(void *) &a atIndex:index]; 

我可以有n個INT對象的數組,所以我不應該硬編碼2.如何確定運行時對象數組的大小?我是否需要數組中的標記值來確定邊界?

2.對於輸入參數和塊參數,__strong限定符是否正確?請注意,該塊是異步的,將在稍後執行。

+0

爲什麼不使用NSArray? – michaels

+0

公平的問題,但我希望API表示它期望一個MyInt對象數組。 NSArray將允許某人傳入任何對象。 – pshah

+1

我仍然可以傳遞任何對象。只需使用NSArray讓您的生活變得輕鬆。 –

回答

0

您的方法不接受數組參數 - 它需要一個指針參數。

在C中,不可能有一個數組類型的參數。如果寫入「X數組」類型的參數,則會自動更改爲鍵入「指向X的指針」。 Objective-C方法是C函數,但故事有些不同。在Xcode的最新版本中,似乎可以擁有數組類型的方法參數(儘管這似乎沒有記錄在任何地方)。但它必須是一個具體的數組類型,即具有在編譯時硬編碼的長度:

- (void)takeIntsAndRecieveIntsAsync:(MyInt *__strong [5]); 

當它是不完整的數組類型(例如MyInt *__strong []),它仍然是自動調整的指針(例如MyInt *__strong *),該值是指向數組的第一個元素的指針。

  1. 在C(和由此的Objective-C),它是不可能知道,給定指針數組,該「陣列」有多少個元素具有的第一個元素。您必須以某種方式單獨獲取此信息(無論它是單獨的長度參數,在某種結構中打包的長度和指針,數組中的「標記」值等)。

  2. 它應該與您將指針傳遞給第一個元素的數組的類型匹配。如果它是一個__strong的數組,那麼它需要指向__strong等。如果您的操作是異步的,那麼您可能需要複製數組(這需要您找出問題1的解決方案,如何弄清楚數組的長度),以便您的異步操作對這些對象具有強烈的引用。因此,您的陣列副本應該包含指針__strong

+0

非常感謝!這非常有幫助! – pshah