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]; 

Я могу иметь массив п Int объектов, поэтому я не должен жёстко 2. Как определить, размер массива объектов во время выполнения? Нужно ли мне иметь значение счетчика в массиве для определения границ?

2. Является ли квалификатор __strong правильным как для входного параметра, так и для параметра блока? Обратите внимание, что блок является асинхронным и будет выполняться позднее.

+0

Почему вы не используете NSArray? – michaels

+0

Яркий вопрос, но я хочу, чтобы API выражал, что он ожидает массив объектов MyInt. NSArray позволит кому-то проходить в любых объектах. – pshah

+1

Я все еще могу передать любые объекты. просто используйте NSArray, чтобы сделать вашу жизнь легкой. –

ответ

0

Ваш метод не принимает параметр массива - он принимает параметр указателя.

В C невозможно иметь параметр типа массива. Если вы напишете параметр типа «массив X», он автоматически изменится, чтобы ввести «указатель на X».

Объективные методы C - это функции C, но история немного отличается. В последних версиях Xcode кажется, что вы можете иметь параметры метода типа массива (хотя это нигде не документируется). Но это должен быть конкретный тип массива, т.е. с длиной HARDCODED во время компиляции:

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

Когда это неполный массив типа (например, MyInt *__strong []), он по-прежнему регулируется автоматически в указатель (например MyInt *__strong *), значение является указателем на первый элемент массива.

  1. В С (и, таким образом, Objective-C), не представляется возможным, чтобы знать, учитывая указатель на первый элемент массива, сколько элементов этого «массива» имеет. Вы должны получить эту информацию по-разному (будь то отдельный параметр длины, длина и указатель, упакованные вместе в какой-то структуре, «контрольное» значение в массиве и т. Д.).

  2. Он должен соответствовать типу массива, по которому вы передаете указатель на первый элемент. Если это массив из __strong, тогда он должен быть указателем на __strong и т. Д. Если ваша операция асинхронна, вам, вероятно, потребуется скопировать массив (который требует, чтобы вы выяснили решение вопроса 1, как выяснить длина массива), так что ваша асинхронная операция будет иметь сильные ссылки на те объекты MyInt. Таким образом, ваша копия массива должна содержать __strong указателей.

+0

Спасибо большое! Это было очень полезно! – pshah

 Смежные вопросы

  • Нет связанных вопросов^_^