没有保留周期,但为什么还有保留周期警告?

时间:2016-05-31 13:41:08

标签: ios objective-c afnetworking retain-cycle

我正在尝试使用AFNetworking2.6.3的UIImageView扩展来从远程服务器获取图像。一切正常,图像已经返回并成功渲染。但我在Xcode7.3.1中得到了一个保留周期警告:在此块中强烈捕获'单元'可能会导致保留周期

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if(self.dataSourceModel) {
        Model *model = self.dataSourceModel.items[indexPath.row];
        NSURL *url = [NSURL URLWithString:model.imageURL];
        NSURLRequest *theRequest = [NSURLRequest requestWithURL:url];
        UIImage *placeholderImage = [UIImage imageNamed:@"placeholder"];

        //I don'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
            [cell setNeedsLayout];
        } failure:nil];
    }
    return cell;
}

我可以看到,因为在块中捕获了单元实例,所以该块具有单元实例的所有权(以及cell.imageView)。如果保留周期确实存在,则单元格或imageView应具有该块的所有权。

但我查看了UIImageView+AFNetworking.hUIImageView+AFNetworking.m源代码,UIImageView没有任何块属性。块只是方法的参数,而不是实例变量。 UITableViewCell也没有块的所有权。

我甚至使用Leaks检查,Leaks没有报告任何错误。

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

  • 这里有保留周期吗?
  • 我真的需要使用__weak cell吗?
  • 或者imageView或者单元格真的拥有我没有意识到的块的所有权?

任何提示都会有所帮助,非常感谢。

1 个答案:

答案 0 :(得分:1)

当然没有保留周期,您可以通过省略完成块中的代码来避免警告。看一下AFNetworking imageView子类(第152行),if (self.dataSourceModel)的最终点是设置图像视图的图像。您的代码需要再次设置它,或者更改布局状态。

也应该不需要tableView:numberOfRowsInSection:。如果数据源是正确构建的,我们已经回答了cellForRow...中的行数,并且当模型为空时答案为零,从而完全避免调用 function curl($url) { $options = Array( CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_AUTOREFERER => TRUE , CURLOPT_TIMEOUT => 120, CURLOPT_MAXREDIRS => 10, CURLOPT_USERAGENT => "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/2008073000 Shredder/3.0a2pre ThunderBrowse/3.2.1.8", CURLOPT_URL => $url, ); $ch = curl_init(); // Initialising cURL curl_setopt_array($ch, $options); $data = curl_exec($ch); curl_close($ch); return $data; } $scraped_page = curl($link);