将id转换为指向NSError指针的指针(NSError **)

时间:2013-05-21 14:40:53

标签: objective-c pointers 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 个答案:

答案 0 :(得分:8)

stub:withBlock:方法或其任何支持基础结构都不能简单地将双指针填充到NSArray中。该数组不会占用非对象,并且指向对象的指针不是对象。还有其他事情要发生。

这显然需要深入研究代码才能弄明白。值被放入数组的位置?那是在-[KWStub processInvocation:]中,显然是使用OCMock getArgumentAtIndexAsObject:添加到NSInvocation的方法。在该方法中,调用使用开关检查所请求的参数的类型,并在必要时将其装箱。

这里的相关案例是最后一个,其中参数类型是^,意思是“指针”。这种论点包含在NSValue中;因此,您的Block收到的数组实际上包含的不是双指针本身,而是包含表示外部指针的NSValue。你只需要将其拆箱。

这应该是这样的:

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