在Xcode的单元测试中发生奇怪的保留周期警告

时间:2016-01-26 16:51:10

标签: ios objective-c xcode unit-testing

我有一项服务,我目前正在编写单元测试。代码按预期工作,但我得到一个奇怪的保留周期警告。

[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");
}];

这并没有给我一个警告。我看到的唯一区别是这是检查数组,另一个是检查特定类型的对象。

2 个答案:

答案 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方法时可能会引起人们的注意。