我有一项服务,我目前正在编写单元测试。代码按预期工作,但我得到一个奇怪的保留周期警告。
[self.myService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) {
XCTAssertNil(obj, @"obj should be nil");
}];
XCTAssertNil(obj, @"obj should be nil");
行在Xcode Capturing 'self' strongly in this block is likely to lead to a retain cycle
中显示警告。
如果我将代码更改为以下内容,则会删除警告:
__weak MyService *weakService = self.myService;
[weakService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) {
XCTAssertNil(obj, @"obj should be nil");
}];
我在其他单元测试中使用self.someService
,从未遇到过这个问题。以前有人经历过这个吗?
修改
我有另一项测试,其中包含以下内容:
[self.myService doSomethingElseCoolWithCompletionBlock:(NSArray *results) {
XCTestAssertNotNil(results, @"results should not be nil");
}];
这并没有给我一个警告。我看到的唯一区别是这是检查数组,另一个是检查特定类型的对象。
答案 0 :(得分:4)
断言它是宏并在内部使用self。 所以你需要创建名为self的局部变量。
__weak id weakSelf = self;
self.fooBlock = ^{
id self = weakSelf;
XCTAssert(YES);
};
答案 1 :(得分:0)
不要这样做:
@interface MyCoolTests : XCTestCase
@property (retain) id myService;
@end
@implementation MyCoolTests
-(void)testCoolness{
self.myService = [MyService new];
self.myService.callback = ^{
XCTAssert(YES);
};
// ...
}
@end
执行以下操作:
@interface MyCoolTests : XCTestCase
@end
@implementation MyCoolTests
-(void)testCoolness{
id myService = [MyService new];
myService.callback = ^{
XCTAssert(YES);
};
// ...
}
@end
这是XCTTestCase的局限性,使用setup
方法时可能会引起人们的注意。