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:,而 zone 参数完全没用。

于 2013-03-16T01:24:17.187 回答
2

NSZone*是一个指针。虽然 OCMock 不为​​原始类型提供“松散”匹配,但它确实有 [OCMArg anyPointer] 来匹配任何指针。

也就是说,如果您只调用expect,而不是andReturn:,那么模拟方法将只返回nil,这可能不是您想要的。我的猜测是,在您的情况下,以下是更好的解决方案:

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

这显然不会创建模拟的副本,它只是确保模拟本身是从调用copyWithZone:时返回的。

于 2013-03-16T12:43:21.150 回答