2013-05-21 2 views
4

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

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

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

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

+0

Почему вы хранить как '' NSError **, а не просто '' NSError *? – trojanfoe

+0

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

+0

Обычно это передается методу, но я не вижу, как он работает, когда вы храните объект NSError в массиве. – trojanfoe

ответ

8

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

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

Соответствующий случай здесь - последний, где тип аргумента - ^, что означает «указатель». Этот аргумент завернут в NSValue; поэтому массив, полученный вашим блоком, фактически содержит не сам двойной указатель, а NSValue, представляющий внешний указатель. Вам просто нужно его удалить.

Это должно выглядеть следующим образом:

NSValue * errVal = array[1]; 
NSError * __autoreleasing * errPtr = (NSError * __autoreleasing *)[errVal pointerValue]; 
+0

Ссылка сломалась! Куда делся «KWStub»? –

+0

Я переместил файлы при конвертации киви в ARC, этот метод уже сейчас: https://github.com/allending/Kiwi/blob/master/NonARC/KWStub.m#L180 –

+0

Спасибо! Есть ли соответствующий метод для версии ARC, на который я должен ссылаться? –

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