1

我正在构建一个仅适用于 iPhone 的小型应用程序(iOS SDK 6.0),并且在 XCode 中出现 EXC_BAD_ACCESS异常。

该应用程序具有UITableView自定义UITableViewCell. 我已经UITableViewCell在一个子类中实现了(我在这里调用它MyCustomCell)并向构造函数添加了另一个参数:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier cellImage:(UIImage *)image;

UIImage添加到contentView方法TableCell中,代码如下:

imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
imageView.image = image;

[self.contentView addSubview:imageView];

这个函数cellForRowAtIndexPath当然是在函数内部调用的:

static NSString *CellIdentifier = @"MyCustomCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
    cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier cellImage:self.cellImage] autorelease];
}

return cell;

(也是)的cellImage属性被声明为(它也是合成的):ViewControllerUITableViewDelegate

@property (nonatomic, retain) UIImage* cellImage;

图像在viewWillAppearViewController 的方法中使用以下行进行初始化:

cellImage = [UIImage imageNamed:@"my_image_resource.png"];

此代码工作正常,但 EXC_BAD_ACCESS 出现,当我自定义与 iOS 6.0 唯一功能的图像

cellImage = [[UIImage imageNamed:@"my_image_resource.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10) resizingMode:UIImageResizingModeStretch];

调试帮助我找到了触发错误的行 - 它在initWithStyleMyCustomCell 实现的方法中:

imageView.image = image;

我已经查看了很多EXC_BAD_ACCESS错误,我还阅读了为什么会出现这个错误的教程,但到目前为止,我并没有取消任何东西。此时可能会释放某些对象,但我无法准确找到哪个对象以及如何解决该问题。

我还尝试在 ViewController 类中创建两个属性,一个用于保存原始图像,另一个用于保存带有插图的图像。然而,它并没有解决问题。

为什么这是一个错误?为什么它不适用于带有插图的图像?我该如何解决这个问题?

谢谢你。

4

2 回答 2

2

执行语句时出现错误imageView.image = image;。因此,image执行此语句时该对象不存在。它必须在以前被释放过,或者由 a 显式发布[release image](因为您不使用 ARC),或者如果image是自动发布的(例如,如果您使用 ARC 创建它[UIImage imageNamed:...])。
正如 Aaron Wojnowski 建议的那样,我认为最好的方法是转换您的代码 ARC。否则,检查是否image可以意外释放。

于 2013-02-03T17:59:13.980 回答
1

您已经为 cellImage 创建了一个属性,但是您使用实例变量而不是为您创建的 setter 来设置它。由于您传递的是一个自动释放的对象,因此当您下次尝试引用它时,它可能已被释放。尝试在下面使用它:

[self setCellImage:[[UIImage imageNamed:@"my_image_resource.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10) resizingMode:UIImageResizingModeStretch]];

或者这样:

self.cellImage = [[UIImage imageNamed:@"my_image_resource.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10) resizingMode:UIImageResizingModeStretch];

使用此代码,图像将在设置器中为您保留,下次您尝试使用它时,内存仍将被分配,您应该不会有任何问题。

如果可能,还可以考虑使用 ARC,因为这些复杂的内存管理东西都是为您处理的。 http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2013-02-03T17:31:37.307 回答