Столкновение имени метода OCMock

Я новый пользователь OCMock, поэтому, возможно, я просто пропустил здесь что-то простое. этот код не компилируется:

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

ошибка

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

подпись метода addOutput на AVCaptureSession выглядит следующим образом

- (void)addOutput:(AVCaptureOutput *)output

насколько я могу судить, проблема в том, что метод addOutput существует как на классах AVCaptureSession, так и на AVAssetReader. сигнатура метода для addOutput на AVAssetReader выглядит следующим образом.

- (void)addOutput:(AVAssetReaderOutput *)output

По-видимому, компилятор думает, что мой mockSession - это AVAssetReader, но я не знаю, почему он выбирает этот класс вместо AVCaptureSession. если я ожидаю другого метода в AVCaptureSession, которого нет в AVAssetReader, тогда он компилируется. я пробовал следующее без успеха. он компилируется, но сбой.

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];

любое руководство здесь?

Ответ 1

ОК, я думаю, он понял это. как я подозревал, это была простая ошибка noob. изменение [OCMArg anyPointer] на [OCMArg any] выполняет следующую работу:

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

Ответ 2

В тех случаях, когда ваша переменная является "id", но метод объявляется с разными сигнатурами в разных классах, вы должны помочь компилятору, наведя объект на правильный тип, например.

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

В любом случае, если аргумент является объектом, как кажется в вашем случае, вы должны использовать любой, а не anyPointer. Но вы поняли, что это уже есть.; -)