Objective c 将id强制转换为指向N错误指针的指针(N错误**)

Objective c 将id强制转换为指向N错误指针的指针(N错误**),objective-c,pointers,nserror,Objective C,Pointers,Nserror,我有一个n错误**存储在一个数组中(因此我可以将其作为array[0])。我试图将其转换为一个变量: NSError*\uuu autoreleasing*errorPointer=(NSError*\uu autoreleasing*)数组[0] 因此,我可以作为*errorPointer访问底层对象 然而,Xcode抱怨说,ARC不允许对指向“NSError*\uuu autoreleasing*”的Objective-C指针进行强制转换。有没有办法在不关闭ARC的情况下到达这个对象?无论是

我有一个
n错误**
存储在一个数组中(因此我可以将其作为
array[0]
)。我试图将其转换为一个变量:

NSError*\uuu autoreleasing*errorPointer=(NSError*\uu autoreleasing*)数组[0]

因此,我可以作为
*errorPointer
访问底层对象


然而,Xcode抱怨说,ARC不允许对指向“NSError*\uuu autoreleasing*”的Objective-C指针进行
强制转换。有没有办法在不关闭ARC的情况下到达这个对象?

无论是
存根:withBlock:
方法还是它的任何支持基础结构都不能简单地将双指针插入
NSArray
。数组不会接受非对象,并且指向对象的指针不是对象。还有别的事

这显然需要对代码进行深入研究才能弄清楚。值放在数组中的什么位置?这在中,显然是使用OCMock添加到
NSInvocation
的方法完成的。在该方法中,调用使用一个开关来检查所请求参数的类型,并在必要时将其装箱

这里的相关案例是最后一个,其中参数类型是
^
,意思是“指针”。这类参数包含在
NSValue
中;因此,块接收的数组实际上包含的不是双指针本身,而是表示外部指针的
NSValue
。你只需要解开它

应该是这样的:

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

为什么要存储为
NSError**
而不仅仅是
NSError*
?我希望无论是谁传入指针,都要有可用的错误对象。这是Cocoa中的一种常见模式,指针通常直接作为参数传入,而不是存储在数组中。当传递给方法时,这很常见,是的,但我看不出在数组中存储
NSError
对象时它是如何工作的。您需要的地址来获取双指针,实际上,不要像这样破坏NSArray的指针存储机制。自动释放参数是为本地人准备的。我不会在生产代码中使用它。在我使用的单元测试框架Kiwi中,有一种方法允许您存根选择器并用任何块替换其代码。它在一个数组中传递所有的方法参数:
[beer stub:@selector(drinkByHand:error:)withBlock:id^(NSArray*params){Hand*Hand=(Hand*)params[0];//这里我想得到错误并填充它,以便模拟失败;返回nil;}]链接断开了!
KWStub
KWStub到底到哪里去了?我在将猕猴桃转换为ARC时移动了文件,这个方法现在就在这里:谢谢!我应该链接到ARC版本的相应方法吗?@JoshCaswell感谢您的解决方案。我也试着用
memcpy做同样的事情,它稍微短了一点,但我不确定它是否正确:
memcpy([array[1]pointerValue],(void*)&error,sizeof(NSError**))(而不是你的两行+
*errPtr=error;
)你能看一下吗?