当TableView中有太多图像时App崩溃

时间:2016-10-27 18:16:17

标签: objective-c image memory directory tableview

我有一个表格,我正在填充存储在Runner Objects中的信息。每个Runner对象都有一个名为fileName的属性,该属性对应于保存在文档目录中的图像。

如果我从空桌开始,我可以添加跑步者和他们的照片,直到我达到约8名跑步者。当我尝试为第8个左右的跑步者添加照片时,应用程序崩溃了。这似乎是一个内存问题,但是当我在本地存储的所有内容都是引用到目录中的图像时,我看不出这是怎么回事。

我将一个运行器对象传递给我的RunnerCell类中的设置单元格方法并按如下方式设置单元格:

if (currentRunner.fileName != nil) {
    if ([manager fileExistsAtPath:fullPath]){

        UIImage *originalImage = [[UIImage alloc] initWithContentsOfFile:fullPath];

        if ([currentRunner.photoOrientation isEqual: @"portrait"]) {
                CGImageRef imageRef = [originalImage CGImage];
                UIImage *rotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationRight];
            self.runnerImageView.image = rotatedImage;
        } else {
            self.runnerImageView.image = originalImage;
        }
        self.addPhotoLabel.hidden = true;
    }
}

1 个答案:

答案 0 :(得分:0)

根据文档声明,您不得在主线程上将图像加载到UITableViewCell。这就是你的应用程序崩溃的原因。 因为当您在主线程上加载图像时,当您滚动时它变得太滞后了,因为可延迟单元格重新分配单元格并再次为即将到来的索引路径单元格加载图像,并且直到图像加载它阻止主线程导致tableview的延迟行为。

请在后台线程中加载缓存的图像。使用此代码。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {

    if ([currentRunner.photoOrientation isEqual: @"portrait"]) {
            CGImageRef imageRef = [originalImage CGImage];
            UIImage *rotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationRight];
        dispatch_sync(dispatch_get_main_queue(), ^(void) {
        self.runnerImageView.image = rotatedImage;
    });
    } else {
          dispatch_sync(dispatch_get_main_queue(), ^(void) {
        self.runnerImageView.image = originalImage;
    });
    }

});