我正在尝试使用 AFNetworking2.6.3 的 UIImageView 扩展从远程服务器获取图像。一切正常,图像已返回并成功渲染。但我在 Xcode7.3.1 中收到保留周期警告:在此 block 中强烈捕获“单元格”可能会导致保留周期
-(UITableViewCell *)tableViewUITableView *)tableView cellForRowAtIndexPathNSIndexPath *)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;
}
我可以看到,由于单元实例已在 block 中捕获,因此 block 具有单元实例的所有权(以及 cell.imageView)。如果保留周期确实存在,则单元格或 imageView 应该拥有 block 的所有权。
但我已经查看了 UIImageView+AFNetworking.h和 UIImageView+AFNetworking.m源代码, UIImageView 没有任何 block 的属性。该 block 只是方法的参数,而不是实例变量。 UITableViewCell 也不拥有 block 的所有权。
我什至用 Leaks 查了一下,Leaks 也没有报错。
所以我相信这里没有保留周期,但为什么我仍然在这里收到 Xcode 警告?如果我使用 __weak cell__weak UITableViewCell *weakCell = cell; ,警告就会消失。但我还是想知道:
- 这里有保留周期吗?
- 我真的需要使用 __weak 单元格吗?
- 或者也许 imageView 或 cell 真的拥有我没有意识到的 block 的所有权?
任何提示都会有所帮助,非常感谢。
Best Answer-推荐答案 strong>
当然没有保留周期,您可以通过省略完成 block 中的代码来避免警告。看一下 AFNetworking imageView 子类(第 152 行),setImage... 的高潮是设置 ImageView 的图像。您的代码需要重新设置它,或更改布局状态。
应该也不需要 if (self.dataSourceModel) 。如果数据源构建正确,我们已经回答了 tableView:numberOfRowsInSection: 中的行数,并且当模型为空时该答案为零,避免调用 cellForRow... 完全一致。
关于ios - 没有保留周期,但为什么仍然收到保留周期警告?,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/37547448/
|