11

私はOCMockの新しいユーザーなので、ここで単純なものが欠けているだけかもしれません. このコードはコンパイルされません:

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[[mockSession expect]  addOutput:[OCMArg anyPointer]];

エラーは

Multiple methods named 'addOutput:' found with mismatched result, parameter type or attributes

AVCaptureSession の addOutput メソッドのシグネチャは次のとおりです。

- (void)addOutput:(AVCaptureOutput *)output

私が知る限り、問題は addOutput メソッドが AVCaptureSession と AVAssetReader クラスの両方に存在することです。AVAssetReader の addOutput のメソッド シグネチャは次のとおりです。

- (void)addOutput:(AVAssetReaderOutput *)output

どうやらコンパイラは私のmockSessionがAVAssetReaderであると考えているようですが、AVCaptureSessionの代わりにそのクラスを選択する理由がわかりません。AVAssetReader に存在しない AVCaptureSession の別のメソッドが必要な場合は、コンパイルされます。私は成功せずに次のことを試みました。コンパイルはできますが、クラッシュします。

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[(AVCaptureSession*)[mockSession expect]  addOutput:[OCMArg anyPointer]];

このコードもコンパイルされず、前のコードと同じエラーが発生します

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
[[mockSession expect]  addOutput:output];

ここに何かガイダンスはありますか?

4

3 に答える 3

17

変数が「id」であるが、メソッドが異なるクラスの異なるシグネチャで宣言されている場合、オブジェクトを正しい型にキャストしてコンパイラを支援する必要があります。

[((AVCaptureSession *)[mockSession expect])  addOutput:[OCMArg any]];

どちらの場合でも、引数がオブジェクトの場合、あなたの場合のように、anyPointer ではなくanyを使用する必要があります。しかし、あなたはすでにそれを理解しています。;-)

于 2013-01-26T20:07:34.153 に答える
8

わかりました、私はそれを理解したと思います。私が疑ったように、それは単純な初心者の間違いでした。[OCMArg anyPointer] を [OCMArg any] に変更すると、次のようになります。

id mockSession = [OCMockObject mockForClass:[AVCaptureSession class]];
[(AVCaptureSession*)[mockSession expect]  addOutput:[OCMArg any]];
于 2013-01-25T19:23:49.933 に答える