簡體   English   中英

使用ARC從NSInvocation獲取對象數組參數

[英]Get object array argument from NSInvocation with 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限定詞對輸入參數和塊參數均正確嗎? 請注意,該塊是異步的,將在以后執行。

您的方法不采用數組參數,而是采用指針參數。

在C語言中,不可能有數組類型的參數。 如果編寫的參數類型為“ X的數組”,則參數將自動更改為“ X的指針”。

Objective-C方法是C函數,但是情況有所不同。 在最新版本的Xcode中,似乎可以使用數組類型的方法參數(盡管似乎沒有在任何地方進行記錄)。 但是它必須是一個具體的數組類型,即在編譯時具有一個硬編碼的長度:

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

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

  1. 在C語言中(因此在Objective-C中),在給定指向數組第一個元素的指針的情況下,無法知道此“數組”具有多少個元素。 您必須以某種方式分別獲取此信息(無論它是一個單獨的length參數,以某種結構打包在一起的length和指針,數組中的“ sentinel”值,等等)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM