Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 确定取消分配UITableViewCell的时间_Objective C_Memory Management_Uitableview - Fatal编程技术网

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被释放时,单元格不是被释放了吗?