2013-03-16 4 views
1

OCMock в настоящее время не поддерживает свободное совпадение примитивных аргументов. Тем не менее у меня есть свойство, которое мне нужно установить на OCMockObject, и это свойство объявлено атрибутом copy. Поэтому он реализует - (id)copyWithZone:(NSZone *)zone. NSZone определяется как typedef struct _NSZone NSZone, а так как это структура, это примитивный тип. Поэтому я получаю ошибкуКак я могу издеваться над NSZone?

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

на этой линии:

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

Это лучший способ решить эту проблему объявляете свойство с атрибутом retain, а не copy? Преимущество использования copy заключается в том, что объект не имеет возможности модифицироваться другим объектом.

ответ

2

NSZone * - указатель. Хотя OCMock не обеспечивает «свободное» сопоставление для примитивных типов, он имеет [OCMArg anyPointer], чтобы соответствовать, ну, любому указателю.

Это сказало, если вы просто позвонить ожидать, а также не andReturn:, то издевался метод просто возвращает ноль, который не может быть то, что вы хотите. Мое предположение состоит в следующем является лучшим решением в Вашем случае:

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

Это, очевидно, не создает копию издеваться, это просто гарантирует, что само по себе издеваться возвращается от вызова copyWithZone:.

3

Просто позвоните -copy вместо этого? Он вызовет -copyWithZone :, и аргумент зоны полностью бесполезен.

Смежные вопросы