大图像崩溃UITableView应用程序

时间:2013-09-20 00:32:23

标签: ios objective-c uitableview

所以我一直在寻找答案,但仍然无法弄明白。我有一个包含15个图像的数组,所以我试图在UITableViewCell中使用子视图进行显示。下面的代码 - 我读过的所有内容都提到使用autorelease / release来解决问题,但我在尝试这样做时只是出现了ARC错误。任何帮助将不胜感激。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    int countthis = indexPath.row;
    NSString *image = imgarr[countthis];
    UIImageView *iv = [[UIImageView alloc] initWithFrame:(CGRect){.size={320, tableView.rowHeight}}];
    iv.image = [UIImage imageNamed:image];
    cell.imageView.image = iv.image;
    return cell;
}

3 个答案:

答案 0 :(得分:2)

无论您的域名是什么,大文件都会导致问题。具体来说,Apple说:

  

您应该避免创建大小超过1024 x 1024的UIImage对象。

看起来您正在尝试调整图像大小,但UIImages是不可变的。因此,您分配的UIImageView仅用于浪费处理器周期。

如果您遇到需要缩小的大图像,请在将它们分配给单元格之前考虑缩放。您可能会发现这些例程很有用:The simplest way to resize an UIImage?

重新自动释放/释放:自ARC以来已弃用。您的代码似乎没有泄漏内存。我不会流汗。但是您应该编辑您的问题以包含有关崩溃的详细信息。

答案 1 :(得分:0)

您的代码可以清理到这一点,这可能会略微提高性能。您不需要将indexPath.row转换为int,因为它已经是NSInteger,这是一种体系结构相关类型(int为32位,long为64位) 。您可能也想使用self.imgarr,因为它可能是您班级中的一个属性。图像变化与Neal一样。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSString *image = self.imgarr[indexPath.row];
    cell.imageView.image = [UIImage imageNamed:image];
    return cell;
}

至于autorelease / release,你提到你使用它们会出现ARC错误,这表明你使用的是iOS 5或更高版本的SDK。您的代码中不再需要它们。

答案 2 :(得分:0)

您可以先尝试使用CGImageSourceCreateThumbnailAtIndex调整图像大小,然后再将其显示在tableview中。

如果您有要调整大小的图像的路径,可以使用:

- (void)resizeImageAtPath:(NSString *)imagePath {
    // Create the image source (from path)
    CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL);

    // To create image source from UIImage, use this
    // NSData* pngData =  UIImagePNGRepresentation(image);
    // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL);

    // Create thumbnail options
    CFDictionaryRef options = (__bridge CFDictionaryRef) @{
            (id) kCGImageSourceCreateThumbnailWithTransform : @YES,
            (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
            (id) kCGImageSourceThumbnailMaxPixelSize : @(640)
    };
    // Generate the thumbnail
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
    CFRelease(src);
    // Write the thumbnail at path
    CGImageWriteToFile(thumbnail, imagePath);
}

更多详情here