我在弹出窗口(iPad)中使用UITableView从文档目录中选择图像。然后,此图像将显示在UIImageView中。这是我用来将新图像放入UIImageView的代码:
- (void)changeImage:(NSString *)imageFilename {
NSLog(@"changeImage to: %@", imageFilename);
NSFileManager *fileMgr;
fileMgr = [NSFileManager defaultManager];
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *imagePath = [docsDir stringByAppendingPathComponent:imageFilename];
UIImage *newImage = [UIImage imageWithContentsOfFile:imagePath];
NSLog(@"Path for new image: %@", imagePath);
self.imageView.image = newImage;
[newImage release];
[fileMgr release];
}
第一次这总是很好用,但每当我尝试再次从弹出窗口更改显示的图像时,我会收到以下错误: 程序接收信号:“EXC_BAD_ACCESS”。
我已将问题缩小到这一行:
self.imageView.image = newImage;
我尝试在该行之前添加以下内容:
self.imageView.image = nil;
没有任何区别。我无法弄清楚为什么这是第一次有效,但下次不会重复相同的行为。
非常感谢任何帮助。
答案 0 :(得分:1)
顺便说一下你也不应该发布fileMgr,因为你不拥有它。文档说它总是相同的实例(单例) - 它不会破坏,因为通常会覆盖单身人士的“释放”,什么都不做。不过,它不一定是这样而且是错误的。
答案 1 :(得分:0)
我对Objective-C没有深刻的理解,但我认为你应该复制图像:
self.imageView.image = [newImage copy];
答案 2 :(得分:0)
从您的代码中删除[newImage release];
,您应该没问题!
您没有分配/保留/新建 newImage ,因此您无需发布它。
它第一次工作,因为UIImage *newImage = [UIImage imageWithContentsOfFile:imagePath];
返回了一个对当前运行循环有效的自动释放对象,但是你过度释放它,并且当运行循环试图再次使用它时EXC_BAD_ACCESS信号。