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

Taz*_*Taz 3 xcode unit-testing objective-c ios

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

[self.myService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) {
    XCTAssertNil(obj, @"obj should be nil");
}];
Run Code Online (Sandbox Code Playgroud)

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");
}];
Run Code Online (Sandbox Code Playgroud)

我正在self.someService其他单元测试中使用,从未遇到过这个问题。有没有人经历过这种情况?

编辑

我有另一个测试,其中包含以下内容:

[self.myService doSomethingElseCoolWithCompletionBlock:(NSArray *results) {
    XCTestAssertNotNil(results, @"results should not be nil");
}];
Run Code Online (Sandbox Code Playgroud)

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

ajj*_*nix 7

断言它是宏并在内部使用 self 。所以你需要创建名为 self 的局部变量。

__weak id weakSelf = self;
self.fooBlock = ^{
    id self = weakSelf;
    XCTAssert(YES);
};
Run Code Online (Sandbox Code Playgroud)