我正在尝试使用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.h和UIImageView+AFNetworking.m源代码,UIImageView没有任何块属性。块只是方法的参数,而不是实例变量。 UITableViewCell也没有块的所有权。
我甚至使用Leaks检查,Leaks没有报告任何错误。
所以我相信这里没有保留周期,但为什么我仍然在这里得到Xcode警告?如果我使用__weak cell __weak UITableViewCell *weakCell = cell;
,则警告将消失。但我还是想知道:
任何提示都会有所帮助,非常感谢。
答案 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);
。