在 下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
属性来解决这个问题,但是当我完成它时我必须退出(就像某种穴居人),这正是那种ARC应该避免的事情。Child
Parent
nil
parent
关于如何在不更改我的应用程序代码的情况下通过此测试的任何建议?
编辑:它似乎与OCMockObject
成为一个有关NSProxy
,如果我做aParent
一个实例NSObject
,child.parent
弱引用“持有”一个非零值。仍在寻找一种在不更改应用程序代码的情况下通过此测试的方法。
编辑 2:在接受 Blake 的回答后,我在我的项目中执行了一个预处理器宏的实现,它有条件地将我的属性从弱 -> 分配。你的旅费可能会改变:
#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