UICollectionView 神秘崩溃

Posted

技术标签:

【中文标题】UICollectionView 神秘崩溃【英文标题】:UICollectionView mysterious crash 【发布时间】:2013-12-06 14:29:49 【问题描述】:

我有一个UICollectionView,我正在用从 Internet 下载的图像填充单元格。为此,我使用SDWebImage。我的代码如下所示:

-(UICollectionViewCell*) collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    NSString *CellIdentifier = @"Gallery_Cell";

    GalleryCell *cell= (GalleryCell *)[self.flowCollection dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];

    if (indexPath.row < self.collectionData.count) 

        CellDetails *dets = [self.collectionData objectAtIndex:indexPath.row];

        NSURL *mainImageURL = [NSURL URLWithString:dets.imageURL];

        cell.image.contentMode = UIViewContentModeScaleAspectFill;
        cell.image.clipsToBounds = YES;

        [cell.image setImageWithURL:mainImageURL placeholderImage:nil];
    

    return cell;

我相信我已正确设置。但应用程序完全随机崩溃 (EXC_BAD_ACCESS),有时会留下此堆栈跟踪:

日志区域中没有其他消息。我尝试设置异常断点,但每次发生此崩溃时,都会显示此堆栈跟踪。有谁知道可能是什么问题?

【问题讨论】:

异常断点在这里不起作用,因为这是一个 EXC_BAD_ACCESS。意味着它可能是分段错误/分段违规。很多机会成为悬空指针 好的。那么我该如何去寻找问题的根源呢?也许是僵尸对象? 我还没有使用集合视图,但你不应该在出列后检查单元格是否为空吗?如果没有,创建单元格? 如果随机崩溃总是发生在同一个堆栈崩溃(NSIndexPath indexAtPosition)中,或者如果它进入其他崩溃堆栈,您应该向我们准确说明。这将有助于理解真正的问题 但是,启用僵尸进行调试。那应该找到并修复丑鸭 【参考方案1】:

如果有人在寻找答案,我已经解决了问题并回答了与同一问题相关的另一个问题。你可以找到它here。希望对您有所帮助!

【讨论】:

【参考方案2】:

您是否注册了您的 CollectionViewCells?

如果你这样做了,

dequeueReusableCellWithReuseIdentifier:forIndexPath:

如果没有可重复使用的单元格,应为您创建一个单元格。

在你的

- (void)viewDidLoad

使用 CollectionView 注册您的 Cells

UINib *galleryCellNib = [UINib nibWithNibName:@"GalleryCell" bundle:nil];
[self.collectionView registerNib:galleryCellNib forCellWithReuseIdentifier:@"Gallery_Cell"];

[self.collectionView registerClass:[GalleryCell class] forCellWithReuseIdentifier:@"Gallery_Cell"];

取决于你是使用 xib 还是只是一个类

【讨论】:

我的单元格是一个 xib,我已将其注册为可重复使用,标识符为“Gallery_Cell” 使用 registerNib:forCellWithReuseIdentifier: ? 是的,和你写的完全一样。 好的,然后尝试在启用僵尸的情况下进行调试 我启用了僵尸并尝试了它,它给出了相同的堆栈跟踪,但这次出现错误:“[NSIndexPath section]: message sent to deallocated instance 0x1c1f8fb0”【参考方案3】:

这也可能发生在 InterfaceBuilder 中的一个连接不再有效时(自定义单元类时 - 通过从 UITableViewCell 或 UICollectionViewCell 继承)。例如:如果文件中控件的名称已更改,但未在 InterfaceBuilder 中更新与它的连接。

【讨论】:

以上是关于UICollectionView 神秘崩溃的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 未注册单元格

UiCollectionView 间距问题 - 快速

RFQuiltLayout 和 UICollectionView

UICollectionView

如何在 UICollectionView 中居中行?

UICollectionView 初始化问题