我在我的应用程序中使用核心数据以及NSFetchedResultsController
填充表格。我的数据库有 40k+ 个条目,所以表很长。每个表格单元格都有一个使用SDWebImage从 Web 加载的缩略图图像。如果我慢慢滚动,一切都会很好,如果我在几秒钟内开始快速滚动,我会崩溃。
NSZombies 没有显示任何有用的东西。
我猜它与网络有关SDWebImage
并从网络加载。工作方式SDWebImage
是在后台加载图像,然后在完成下载后设置下载的图像(罗嗦)。我的想法是单元格正在被释放UITableView
,然后SDWebImage
尝试在释放的单元格上设置图像。因此,如果我可以确定何时UITableViewCell
将被释放,我可以停止SDWebImage
下载过程并希望解决问题。
我试图添加
- (void)dealloc {
NSLog(@"dealloc");
}
赶上单元格何时被释放,但我什么也没得到。
编辑
我-(void)dealloc
在子类 UITableViewCell 中有我的方法。
编辑 这是我创建单元格的位置/方式
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* inventoryCellID = @"InventoryCustomCellID";
InventoryCustomCell* cell = (InventoryCustomCell *)[tableView dequeueReusableCellWithIdentifier:inventoryCellID forIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
- (void)configureCell:(InventoryCustomCell *)cell atIndexPath:(NSIndexPath *)indexPath {
[cell formatCellWithProduct:[fetchedResultsController objectAtIndexPath:indexPath] enableAdding:NO];
cell.openThumbnailButton.tag = indexPath.row;
[cell.openThumbnailButton addTarget:self action:@selector(presentThumbnailViewWithCell:) forControlEvents:UIControlEventTouchUpInside];
}
在我的自定义单元格中,这是被调用的配置方法:
- (void)formatCellWithProduct:(Product*)product enableAdding:(bool)addingEnabled {
self.titleLabel.text = product.part_number;
self.partNumberLabel.text = [[[product.manufacturer allObjects] objectAtIndex:0] name];
//The SDWebImage UIImageView category method
[self.thumbImageView setImageWithURL:[NSURL URLWithString:product.photo] placeholderImage:[UIImage imageNamed:@"icon.png"]];
}
编辑 这是下载图像并设置它的 SDWebImage 方法。
- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock;
{
[self cancelCurrentImageLoad];
self.image = placeholder;
if (url)
{
__weak UIImageView *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIImageView *sself = wself;
if (!sself) return;
if (image)
{
sself.image = image;
[sself setNeedsLayout];
}
if (completedBlock && finished)
{
completedBlock(image, error, cacheType);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}