1

OCMockは現在、プリミティブ引数の緩いマッチングをサポートしていません。しかし、に設定する必要のあるプロパティがありOCMockObject、このプロパティはcopy属性で宣言されています。したがって、を実装し- (id)copyWithZone:(NSZone *)zoneます。NSZoneはとして定義されtypedef struct _NSZone NSZone、構造体であるため、プリミティブ型です。したがって、エラーが発生します

Incompatible pointer types sending 'id' to parameter of type 'NSZone *' (aka 'struct _NSZone *')

この行で:

[[mockObject expect] copyWithZone:[OCMArg any]];

retainこれを解決する最善の方法は、プロパティではなく属性を使用してプロパティを宣言することcopyですか?使用する利点はcopy、オブジェクトが別のオブジェクトによって変更される可能性がないことです。

4

2 に答える 2

3

代わりに -copy を呼び出すだけですか?-copyWithZone: が呼び出され、ゾーン引数はまったく役に立ちません。

于 2013-03-16T01:24:17.187 に答える
2

NSZone*はポインターです。OCMock はプリミティブ型の「緩い」マッチングを提供しませんが、[OCMArg anyPointer] を使用して任意のポインターに一致させます。

そうは言っても、 andReturn:ではなく、単にexpectを呼び出すと、モックされたメソッドはnilを返すだけになり、これはあなたが望むものではないかもしれません. 私の推測では、あなたの場合、以下がより良い解決策です:

[[[mock expect] andReturn:mock] copyWithZone:[OCMArg anyPointer]];

これは明らかにモックのコピーを作成するのではなく、 copyWithZone:の呼び出しからモック自体が確実に返されるようにするだけです。

于 2013-03-16T12:43:21.150 に答える