我有一个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的情况下到达这个对象?
答案 0 :(得分:8)
stub:withBlock:
方法或其任何支持基础结构都不能简单地将双指针填充到NSArray
中。该数组不会占用非对象,并且指向对象的指针不是对象。还有其他事情要发生。
这显然需要深入研究代码才能弄明白。值被放入数组的位置?那是在-[KWStub processInvocation:]
中,显然是使用OCMock getArgumentAtIndexAsObject:
添加到NSInvocation
的方法。在该方法中,调用使用开关检查所请求的参数的类型,并在必要时将其装箱。
这里的相关案例是最后一个,其中参数类型是^
,意思是“指针”。这种论点包含在NSValue
中;因此,您的Block收到的数组实际上包含的不是双指针本身,而是包含表示外部指针的NSValue
。你只需要将其拆箱。
这应该是这样的:
NSValue * errVal = array[1];
NSError * __autoreleasing * errPtr = (NSError * __autoreleasing *)[errVal pointerValue];