Приведение идентификатора к указателю на указатель NSError (NSError **)

У меня есть NSError ** хранится в массиве (так что я могу получить его как таковой array[0]). Я пытаюсь преобразовать его в переменную:

NSError * __autoreleasing *errorPointer = (NSError * __autoreleasing *)array[0];

так что я могу получить доступ к базовому объекту как *errorPointer,

Тем не менее, Xcode жалуется, что Cast of an Objective-C pointer to 'NSError *__autoreleasing *' is disallowed with ARC, Есть ли способ добраться до этого объекта, не выключая ARC?

1 ответ

Решение

Ни то, ни другое stub:withBlock: метод или любая из его вспомогательной инфраструктуры может просто вставлять двойной указатель в NSArray, Массив не будет принимать не-объекты, а указатель на объект не является объектом. Там что-то еще происходит.

Это, очевидно, требует некоторого изучения кода. Где значение попадает в массив? Это в -[KWStub processInvocation:] и это делается, по-видимому, с использованием метода, добавленного к NSInvocation OCMock, getArgumentAtIndexAsObject:, В этом методе вызов использует переключатель, чтобы проверить тип запрашиваемого аргумента, и при необходимости заполняет его.

Соответствующий случай здесь является последним, где тип аргумента ^, что означает "указатель". Такого рода аргументы заключены в NSValue; следовательно, массив, полученный вашим Блоком, фактически содержит не сам двойной указатель, а NSValue представляющий внешний указатель. Вам просто нужно распаковать его.

Это должно выглядеть так:

NSValue * errVal = array[1];
NSError * __autoreleasing * errPtr = (NSError * __autoreleasing *)[errVal pointerValue];
Другие вопросы по тегам