我在我的应用中使用核心数据以及NSFetchedResultsController
来填充表格。我的数据库有40k +条目,因此表格相当长。每个表格单元格都有一个缩略图图像,使用SDWebImage从网络加载。如果我慢慢滚动,一切都很好,如果我在几秒钟内开始快速滚动,我就会崩溃。
NSZombies没有显示任何有用的内容。
我猜它与SDWebImage
有关并从网上加载。 SDWebImage
的工作方式是在后台加载图像,然后在下载完成后设置下载的图像(罗嗦)。我的想法是UITableView
正在释放单元格,然后SDWebImage
尝试在解除分配的单元格上设置图像。因此,如果我可以确定何时将UITableViewCell
解除分配,我可以停止SDWebImage
下载过程并希望解决问题。
我试图添加
- (void)dealloc {
NSLog(@"dealloc");
}
当细胞将要解除分配但是我什么也得不到时,才能抓住它。
修改
我在子类UITableViewCell中有-(void)dealloc
方法。
修改 这是我创建单元格的地方/方式
- (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);
}
}
答案 0 :(得分:14)
表视图不倾向于分配和释放表视图单元。创建单元格很昂贵,因此可以在可能的情况下重用它们,而不是在它们离开屏幕时被丢弃。
UITableViewDelegate
方法-tableView:didEndDisplayingCell:forRowAtIndexPath:
是更新单元格以取消下载或其他不再相关操作的更好位置。
看起来每个-setImageWithURL:etc:etc:
的调用都试图取消该图像视图的先前下载。
答案 1 :(得分:0)
你没有解释你把dealloc方法放在哪里..
我认为如果调用了单元格的释放(不是tu子类UITableviewCell
),我可以尝试将一个类别添加到viewcontroller中以进行调试。
例如:
@implementation UITableViewCell(Dealloc)
- (void)dealloc {
NSLog(@"dealloc");
[super dealloc];
}
@end
你使用ARC吗?如果不是你忘了
InventoryCustomCell* cell = (InventoryCustomCell *)[[tableView dequeueReusableCellWithIdentifier:inventoryCellID forIndexPath:indexPath] autorelease];