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

ios - 没有保留周期,但为什么仍然收到保留周期警告?


                                            <p><p>我正在尝试使用 AFNetworking2.6.3 的 UIImageView 扩展从远程服务器获取图像。一切正常,图像已返回并成功渲染。但我在 Xcode7.3.1 中收到保留周期警告:<strong>在此 block 中强烈捕获“单元格”可能会导致保留周期</strong></p>

<pre><code>-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = ;
    if(self.dataSourceModel) {
      Model *model = self.dataSourceModel.items;
      NSURL *url = ;
      NSURLRequest *theRequest = ;
      UIImage *placeholderImage = ;

      //I don&#39;t use __weak cell in the block
      [cell.imageView setImageWithURLRequest:theRequest placeholderImage:placeholderImage success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
            cell.imageView.image = image; //get warning at this line
            ;
      } failure:nil];
    }
    return cell;
}
</code></pre>

<p>我可以看到,由于单元实例已在 block 中捕获,因此 block 具有单元实例的所有权(以及 cell.imageView)。如果保留周期确实存在,则单元格或 imageView 应该拥有 block 的所有权。 </p>

<p>但我已经查看了 <a href="https://github.com/AFNetworking/AFNetworking/blob/2.6.3/UIKit%2BAFNetworking/UIImageView%2BAFNetworking.h" rel="noreferrer noopener nofollow">UIImageView+AFNetworking.h</a>和 <a href="https://github.com/AFNetworking/AFNetworking/blob/2.6.3/UIKit%2BAFNetworking/UIImageView%2BAFNetworking.m" rel="noreferrer noopener nofollow">UIImageView+AFNetworking.m</a>源代码, UIImageView 没有任何 block 的属性。该 block 只是方法的参数,而不是实例变量。 UITableViewCell 也不拥有 block 的所有权。</p>

<p>我什至用 Leaks 查了一下,Leaks 也没有报错。 </p>

<p>所以我相信这里没有保留周期,但为什么我仍然在这里收到 Xcode 警告?如果我使用 __weak cell<code>__weak UITableViewCell *weakCell = cell;</code>,警告就会消失。但我还是想知道:</p>

<ul>
<li>这里有保留周期吗?</li>
<li>我真的需要使用 __weak 单元格吗?</li>
<li>或者也许 imageView 或 cell 真的拥有我没有意识到的 block 的所有权?</li>
</ul>

<p>任何提示都会有所帮助,非常感谢。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当然没有保留周期,您可以通过省略完成 block 中的代码来避免警告。看一下 AFNetworking imageView 子类(第 152 行),<code>setImage...</code> 的高潮是设置 ImageView 的图像。您的代码需要重新设置它,或更改布局状态。</p>

<p>应该也不需要 <code>if (self.dataSourceModel)</code>。如果数据源构建正确,我们已经回答了 <code>tableView:numberOfRowsInSection:</code> 中的行数,并且当模型为空时该答案为零,避免调用 <code>cellForRow... </code> 完全一致。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 没有保留周期,但为什么仍然收到保留周期警告?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37547448/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37547448/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 没有保留周期,但为什么仍然收到保留周期警告?