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。配列は非オブジェクトを取りません。オブジェクトへのポインターはオブジェクトではありません。何か他のことが起こっています。

これを理解するには、明らかにコードを掘り下げる必要があります。値は配列のどこに入れられますか? これはにあり、明らかに OCMock によって-[KWStub processInvocation:]追加されたメソッドを使用して行われます。そのメソッドでは、呼び出しはスイッチを使用して要求された引数の型をチェックし、必要に応じてそれをボックス化します。NSInvocationgetArgumentAtIndexAsObject:

ここで関連するケースは最後のケースで、引数の型は^「ポインタ」を意味する です。この種の引数はNSValue;でラップされます。したがって、ブロックが受け取る配列には、ダブル ポインター自体ではなく、NSValue外部ポインターを表す が実際に含まれます。箱から出すだけです。

次のようになります。

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