Под ARC
у меня есть объект, Child
, который имеет свойство weak
, parent
. Я пытаюсь написать несколько тестов для Child
и проверяю свойство parent
, используя OCMock
.
В ARC установка подкласса NSProxy
с использованием синтезированного установщика слабого свойства не устанавливает свойство ... строка после установки слабого свойства, проверяя его, показывает, что оно уже 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
когда я закончил с этим (вроде какого-то пещерного человека), это именно то, что АРК должен был избежать.
Любые предложения о том, как пройти этот тест без изменения кода моего приложения?
Редактировать : Кажется, это связано с OCMockObject
, являющимся NSProxy
, если я сделаю aParent
экземпляром NSObject
, слабая ссылка child.parent
"держит" ненулевое значение. Все еще ищу способ выполнить этот тест без изменения кода приложения.
Редактировать 2 : Приняв ответ Блейка, я реализовал в своем проекте макрос препроцессора, который условно изменил мои свойства со слабого -> назначить. Ваш пробег может варьироваться:
#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