【问题标题】:UICollectionView bad acces on -> UICollectionViewData _setLayoutAttributes:atGlobalIndex:UICollectionView 错误访问 -> UICollectionViewData _setLayoutAttributes:atGlobalIndex:
【发布时间】:2013-04-03 11:27:29
【问题描述】:

我使用 UICollectionView 显示大量图像,其中包含 32 个批次。每次我到达集合视图的末尾时,我都会加载另一批 32 个图像并调整 collectionView contentsize.width 的大小以接受新项目.通过使用 AFNetworking 调用 Web 服务来进行加载。

当我从头到尾快速滚动到尾到头时,我收到一个 EXC_BAD_ACCESS。 当到达 CollectionView 的末尾时也会发生这种情况。这就像它试图加载一些尚不可用的属性。 我从 1 天开始就试图弄清楚,但没有任何成功。我尝试使用仪器/启用 NSZombie/guardmalloc ...

编辑

还有一个很奇怪的想法:这个bad access只有在我用真正的UICollectionView替换PSTCollectionView时才出现。所以为了确保我只是做了反向移动并将 UICollectionView 替换为 PSTCollectionView 并且 badaccess 消失了。 我完全迷路了:)

结束编辑

我在项目中同时使用 arc 和非 arc 文件。 我唯一能发现的就是这个堆栈跟踪:

您的帮助将不仅仅是欢迎。

块引用

【问题讨论】:

  • 你在使用 CoreData 和 NSFetchedResultsController 吗?
  • 不,我正在使用 AFNetworking 获取图像

标签: ios exc-bad-access uicollectionview pstcollectionview


【解决方案1】:

问题可能是图像太大。您可能想要做的是在每个 UIImageView 上设置图像属性之前从下载的图像中调整图像的大小。

Bill Dudney 就该主题发表了一本非常有用的 iBook,其中详细介绍了图像对内存的影响以及如何针对它进行优化。它是 4.99 美元,非常有用。

https://itunes.apple.com/us/book/all-image-io-you-need-to-know/id601759073?mt=11

以下方法会将图像调整为给定大小,这将减少内存占用并有望防止您的问题。

- (UIImage *)resizeImage:(UIImage *)image size:(CGSize)size {
    UIGraphicsBeginImageContext(size);
    [image drawInRect: CGRectMake(0, 0, width, height)];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return resizedImage;
}

现在,如果您使用 AFNetworking 直接从使用 AFNetworking 类别的 URL 设置图像,您可能需要使用替代方法,以便您可以干预和调整图像大小。下面的代码会做到这一点。

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:imageURL];
[request addValue:@"image/*" forHTTPHeaderField:@"Accept"];

[imageView setImageWithURLRequest:request placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
    // resize image
    // set image on imageView
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
    // handle error
}];

【讨论】:

  • 我试过你的答案,但没有任何成功。这很奇怪,因为我在代码中更改了注释,只需将 PSTCollectionView 替换为 UICollectionView。使用 iOS7 我真的需要替换旧代码。 UIcollectionView 实在是太快了。
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 2019-05-07
相关资源
最近更新 更多