菜鸟教程小白 发表于 2022-12-13 12:51:09

ios - Xcode 单元测试中出现奇怪的保留周期警告


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

<pre><code>[self.myService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) {
    XCTAssertNil(obj, @&#34;obj should be nil&#34;);
}];
</code></pre>

<p><code>XCTAssertNil(obj, @"obj should be nil");</code> 行在 Xcode 中显示警告 <code>在此 block 中强烈捕获 'self' 可能会导致保留周期</code>.</p>

<p>如果我将代码更改为以下内容,警告将被删除:</p>

<pre><code>__weak MyService *weakService = self.myService;
[weakService doSomethingCoolWithCompletionBlock:^(MyResponseObject *obj) {
    XCTAssertNil(obj, @&#34;obj should be nil&#34;);
}];
</code></pre>

<p>我在其他单元测试中使用了 <code>self.someService</code>,从来没有遇到过这个问题。以前有人遇到过这种情况吗?</p>

<p><strong>编辑</strong></p>

<p>我有另一个测试具有以下内容:</p>

<pre><code>[self.myService doSomethingElseCoolWithCompletionBlock:(NSArray *results) {
    XCTestAssertNotNil(results, @&#34;results should not be nil&#34;);
}];
</code></pre>

<p>这不会给我警告。我看到的唯一区别是,这是检查数组,而另一个检查特定类型的对象。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>断言它是宏,并在内部使用了 self。
所以你需要创建名称为 self 的局部变量。</p>

<pre><code>__weak id weakSelf = self;
self.fooBlock = ^{
    id self = weakSelf;
    XCTAssert(YES);
};
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Xcode 单元测试中出现奇怪的保留周期警告,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/35019301/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/35019301/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Xcode 单元测试中出现奇怪的保留周期警告