Приведение идентификатора к указателю на указатель 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];