Ни тот метод stub:withBlock:
, ни какая-либо его поддерживающая инфраструктура не может просто наложить двойной указатель на NSArray
. Массив не принимает не объекты, а указатель на объект не является объектом. Там что-то происходит.
Для этого, очевидно, требуется некоторое копание кода. Где значение попадает в массив? Это находится в -[KWStub processInvocation:]
, и это сделано, по-видимому, используя метод, добавленный к NSInvocation
от OCMock, getArgumentAtIndexAsObject:
. В этом методе при вызове используется переключатель для проверки типа запрашиваемого аргумента и при необходимости помещает его в квадрат.
Соответствующий случай здесь - последний, где тип аргумента - ^
, что означает «указатель». Этот аргумент завернут в NSValue
; поэтому массив, полученный вашим блоком, фактически содержит не сам двойной указатель, а NSValue
, представляющий внешний указатель. Вам просто нужно его удалить.
Это должно выглядеть следующим образом:
NSValue * errVal = array[1];
NSError * __autoreleasing * errPtr = (NSError * __autoreleasing *)[errVal pointerValue];
Почему вы хранить как '' NSError **, а не просто '' NSError *? – trojanfoe
Я хочу, чтобы кто-либо передал указатель, чтобы иметь объект ошибки. Это общий шаблон в Cocoa, указатели обычно передаются непосредственно в качестве аргументов, но не сохраняются в массиве. –
Обычно это передается методу, но я не вижу, как он работает, когда вы храните объект NSError в массиве. – trojanfoe