我该如何模拟NSZone?

时间:2013-03-16 00:38:29

标签: objective-c ocmock

OCMock目前不支持原始参数的松散匹配。但是我需要在OCMockObject上设置一个属性,并使用copy属性声明此属性。因此它实现了- (id)copyWithZone:(NSZone *)zoneNSZone定义为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的好处是对象不可能被另一个对象修改。

2 个答案:

答案 0 :(得分:3)

只是打电话给-copy?它会调用-copyWithZone :,而zone参数完全没用。

答案 1 :(得分:2)

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

那就是说,如果你只是打电话给期待,而不是和返回:,那么模拟的方法只会返回 nil ,这可能是不是你想要的。我的猜测是以下是一个更好的解决方案:

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

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

相关问题