В ARC у меня есть объект Child, у которого есть свойство weak, parent. Я пытаюсь написать несколько тестов для Child, и я издеваюсь над свойством parent, используя OCMock.
В ARC установка подкласса NSProxy с использованием синтезированного слабого свойства setter не устанавливает свойство... строка после свойства 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 для ссылки на parent, но тогда мне нужно nil выйти из parent когда я закончил с ним (как какой-то пещерный человек), что именно то, что ARC должно было устранить.
Любые предложения о том, как пройти этот тест, не меняя код приложения?
Изменить: похоже, что OCMockObject является NSProxy, если я делаю aParent экземпляр NSObject, слабая ссылка "" значение, отличное от нуля". Все еще ищете способ пройти этот тест без изменения кода приложения.
Изменить 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