4

我有一个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 的情况下到达这个对象?

4

1 回答 1

8

stub:withBlock:方法或其任何支持基础设施都不能简单地将双指针填充到NSArray. 数组不会接受非对象,指向对象的指针不是对象。还有其他事情发生。

这显然需要深入研究代码才能弄清楚。值在哪里被放入数组中?那是在 中-[KWStub processInvocation:],显然是使用NSInvocationOCMock添加的方法完成的getArgumentAtIndexAsObject:。在该方法中,调用使用开关来检查所请求参数的类型,并在必要时将其装箱。

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

这应该是这样的:

NSValue * errVal = array[1];
NSError * __autoreleasing * errPtr = (NSError * __autoreleasing *)[errVal pointerValue];
于 2013-05-21T18:47:48.253 回答