UICollectionView在滚动时收到内存警告

时间:2014-03-31 21:08:17

标签: ios iphone objective-c ios7 uicollectionview

我正在一个UICollectionView开发一个ViewController的应用。

CollectionView它是一个图库,每行有3张图片。

CollectionView

我从服务器中获取了30张图片,第一个网址和代码的图像,当单元格将在cellForItemAtIndexPath中显示时,我使用SDWebImage Library异步下载这些图片。每30张图片我再次呼叫网络服务,我得到30张图片,更多发送带有限制和偏移的请求。这可能发生100次,有3000张图片的配置文件。

好吧,我的问题来自于我在iPhone 4中启动应用程序,经过一些快速滚动后我开始获取Received Memory Warnings并在发出一些警告后应用程序崩溃。当我在模拟器中进行相同的测试时,没有任何不好的事情发生。

每次下载30张图片时,我都会将结果数组添加到NSMutableArray *data property处理CollectionView数据, reload collectionView。我曾尝试使用带分配的仪器,但我很难理解发生了什么。

这是我用来创建单元格的代码

-(UICollectionViewCell *)collectionView:(LZProfileImagesCollectionView *)aCollectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    if(aCollectionView == self.imagesCollectionView){
        if([self.data count] - 12 == indexPath.row){
            self.photoOffset += 30;
            [self loadUserData];
        }

        LZProfileCollectionViewCell * cell = (LZProfileCollectionViewCell *)[imagesCollectionView dequeueReusableCellWithReuseIdentifier:ImageCollectionCellIdentifier forIndexPath:indexPath];
        Image *image =(self.data)[indexPath.row];
        [cell configureCellWithImage:image];

        return cell;
    }
    return  nil;
}

LZProfileCollectionViewCell单元格中我有这个:

-(void)configureCellWithImage:(Image *)image
{
    [self setNeedsDisplay];

    // Imagen
    NSString *imageUrl  = [kBaseURL stringByAppendingString:image.imageStringUrl];
    [self.pictureImg setImageWithURL:[NSURL URLWithString:imageUrl] placeholderImage:[UIImage imageNamed:kDefaultLoadingImage]];
    [self.pictureImg setContentMode:UIViewContentModeScaleAspectFit];

}

我从SDWebImage

中取走了setImageWithURL

3分钟后,我在仪器(统计)中得到了这个快照

Statistics

提前谢谢

4 个答案:

答案 0 :(得分:0)

嗯,你正在缓存一个数组中的每个图像,所以一旦你缓存了这么多的图像,你最终将会耗尽内存。它不会在模拟器上发生,因为模拟器拥有与运行它的计算机一样多的内存,因此它不太可能耗尽内存,但真正的设备会很快耗尽。我自己处理内存错误并清空阵列,为新图像释放新空间。或者更好的是创建自己的缓存机制来保存和清除暂时无法查看的图像,无论哪种方式,您都必须在达到某个阈值后转储图像。

答案 1 :(得分:0)

在方法– didReceiveMemoryWarning中,您应该释放存储图像的阵列的一些内存。也许你没有显示的第一个图像存储了第二个数组,如辅助数组。

答案 2 :(得分:0)

这可能发生了,因为很多UIImage个对象最终都在内存中。您可以将其缓存在磁盘上。 AFNetworking有一个很好的UIImageView category可以自动完成所有这些操作。

如果你没有将图像保存在dataSource数组中,那么它们可能会被保留在其他地方,这是一个错误。

另外,请确保您拥有dequeuing个单元格,而不是创建新单元格。

答案 3 :(得分:0)

我经历过类似的情况,所以我回答这个问题虽然原因与你的原因有点不同。

我在UITableViewCell中有一个水平UICollectionView。当我快速左右滚动UICollectionView时,整个用户界面(甚至主页按钮)都会停止,一段时间后应用程序崩溃并显示消息" 来自调试器的消息:由于内存问题而终止& #34;即使没有didReceiveMemoryWarning调用,也在控制台上。

我使用UICollectionViewCell测试它,没有任何UI组件但没有更改。 XCode配置文件工具表示它实际上在UI停止时分配内存,直到它崩溃,即使没有任何UI组件也是如此。

唯一可疑的一点是我用 AppDelegate.window.size.width * 0.35 设置了UICollectionViewCell子视图的宽度(自定义UIView固定到所有超视图边缘)以确定UICollectionViewCell的宽度,它是一个浮点值,如130.25

当我将此值硬编码为130时,所有崩溃都消失了。我觉得有些事情发生在引擎盖下,这个模糊的值为130.25,它偶尔会将宽度确定为130或130.25。

所以我现在使用 CGFloat(Int(AppDelegate.window.size.width * 0.35)),一切都很好。