Objective c 确定取消分配UITableViewCell的时间
我正在使用我的应用程序中的核心数据以及Objective c 确定取消分配UITableViewCell的时间,objective-c,memory-management,uitableview,Objective C,Memory Management,Uitableview,我正在使用我的应用程序中的核心数据以及NSFetchedResultsController来填充表。我的数据库有40k+个条目,因此表相当长。每个表单元格都有一个缩略图,使用从web加载。如果我慢慢滚动,一切都很好,如果我在几秒钟内开始快速滚动,我会崩溃 NSZombies没有显示任何有用的东西 我猜这与SDWebImage和从web加载有关。SDWebImage的工作方式是在后台加载图像,然后在下载完成后设置下载的图像(wordy)。我的想法是,UITableView正在释放单元格,然后SDW
NSFetchedResultsController
来填充表。我的数据库有40k+个条目,因此表相当长。每个表单元格都有一个缩略图,使用从web加载。如果我慢慢滚动,一切都很好,如果我在几秒钟内开始快速滚动,我会崩溃
NSZombies没有显示任何有用的东西
我猜这与SDWebImage
和从web加载有关。SDWebImage
的工作方式是在后台加载图像,然后在下载完成后设置下载的图像(wordy)。我的想法是,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);
}
}
-(void)setImageWithURL:(NSURL*)url占位符图像:(UIImage*)占位符选项:(SDWebImageOptions)选项进度:(SDWebImageDownloaderProgressBlock)进度块已完成:(SDWebImageCompletedBlock)已完成块;
{
[self-cancelCurrentImageLoad];
self.image=占位符;
如果(url)
{
__弱UIImageView*wself=self;
id操作=[SDWebImageManager.sharedManager下载WithURL:url选项:选项进度:progressBlock完成:^(UIImage*图像,NSError*错误,SDImageCacheType cacheType,BOOL完成)
{
__强UIImageView*sself=wself;
如果(!sself)返回;
如果(图像)
{
self.image=图像;
[sself setNeedsLayout];
}
if(已完成的块和已完成的(&F)
{
completedBlock(图像、错误、缓存类型);
}
}];
objc_setAssociatedObject(self,&operationKey,operation,objc_ASSOCIATION_RETAIN_NONATOMIC);
}
}
你没有解释你把dealloc方法放在哪里了
我想如果你的单元格的分配被调用(不是Tube子类<代码> UITable VIEW CCELL ),你可以尝试添加一个类别到你的VIEW控制器进行调试。p> 例如:
@implementation UITableViewCell(Dealloc)
- (void)dealloc {
NSLog(@"dealloc");
[super dealloc];
}
@end
你用弧吗?如果没有,那你就忘了
InventoryCustomCell* cell = (InventoryCustomCell *)[[tableView dequeueReusableCellWithIdentifier:inventoryCellID forIndexPath:indexPath] autorelease];
表视图不太倾向于分配和取消分配表视图单元格。创建单元的成本很高,所以它们可以在可能的情况下重复使用,而不是在离开屏幕时被丢弃
UITableViewDelegate
方法-tableView:didendisplayingcell:forRowAtIndexPath:
是更新单元格以取消下载或其他不再相关的操作的最佳位置
不过,每次调用
-setImageWithURL:etc:etc:
都会试图取消该图像视图以前的下载 我已经更新了我的问题,但在UITableViewCellShow please cellForRow的子类中有dealloc方法。。Method instruments告诉你什么?经过一些挖掘,发现“setImageWithURL”上的完成块正在发送到一个已解除分配的实例。因此,我的假设是正确的,我需要找到一种方法来通知TableView正在释放的单元格。请发布该块。由于单元重用,您不应指望取消分配cells@vikingosegundo我已经更新了下载块。当tableview被释放时,单元格不是被释放了吗?