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
的好处是对象不可能被另一个对象修改。
答案 0 :(得分:3)
只是打电话给-copy?它会调用-copyWithZone :,而zone参数完全没用。
答案 1 :(得分:2)
NSZone * 是一个指针。虽然OCMock不为原始类型提供“松散”匹配,但它确实有[OCMArg anyPointer]来匹配任何指针。
那就是说,如果你只是打电话给期待,而不是和返回:,那么模拟的方法只会返回 nil ,这可能是不是你想要的。我的猜测是以下是一个更好的解决方案:
[[[mock expect] andReturn:mock] copyWithZone:[OCMArg anyPointer]];
这显然不会创建模拟的副本,它只是确保模拟本身是从 copyWithZone:的调用返回的。