Как я могу заставить OCMock в ARC прекратить обнуление набора подклассов NSProxy с использованием слабого свойства?

В ARC у меня есть объект Child , который имеет свойство weak , parent . Я пытаюсь написать несколько тестов для Child , и я высмеиваю его свойство parent , используя OCMock .

В ARC установка подкласса NSProxy с использованием синтезированного средства задания слабых свойств не устанавливает свойство ...строка после установки свойства weak, проверка показывает, что оно уже nil . Вот конкретный пример:

@interface Child : NSObject
@property (nonatomic, weak) id <ParentInterface>parent;
@end

@implementation Child
@synthesize parent = parent_;
@end

//  ... later, inside a test class ...

- (void)testParentExists
{
    // `mockForProtocol` returns an `NSProxy` subclass
    //
    OCMockObject *aParent = [OCMockObject mockForProtocol:@protocol(ParentInterface)];
    assertThat(aParent, notNilValue());

    // `Child` is the class under test
    //
    Child *child = [[Child alloc] init];
    assertThat(child, notNilValue());

    assertThat(child.parent, nilValue());
    child.parent = (id<ParentInterface>)aParent;
    assertThat([child parent], notNilValue());  // <-- This assertion fails
    [aParent self]; // <-- Added this reference just to ensure `aParent` was valid until the end of the test.
}

Я знаю, что могу обойти это, используя свойство assign вместо свойства weak для Child для ссылки на Родитель , но тогда мне пришлось бы ноль из родителя , когда я покончил с этим (как какой-то пещерный человек), что в точности такое вещь, которую ARC должен был избежать.

Есть предложения о том, как пройти этот тест без изменения кода моего приложения?

Изменить : похоже, это связано с тем, что OCMockObject является NSProxy , если я сделаю aParent экземпляром NSObject , слабая ссылка child.parent «содержит» ненулевое значение. Все еще ищу способ пройти этот тест, не меняя код приложения.

Редактировать 2 : Приняв ответ Блейка, я реализовал в своем проекте макрос препроцессора, который условно изменил мои свойства с weak -> assign. Ваш пробег может отличаться:

#if __has_feature(objc_arc)
#define BBE_WEAK_PROPERTY(type, name) @property (weak, nonatomic) type name
#else
#define BBE_WEAK_PROPERTY(type, name) @property (assign, nonatomic) type name
#endif
10
задан Prairiedogg 5 June 2012 в 05:13
поделиться