所以我一直在寻找答案,但仍然无法弄明白。我有一个包含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;
}
答案 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。