在UIImageView上更改视图属性时出现内存问题

时间:2011-05-07 16:08:26

标签: objective-c cocoa-touch ipad uiimageview uiimage

我在弹出窗口(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;

没有任何区别。我无法弄清楚为什么这是第一次有效,但下次不会重复相同的行为。

非常感谢任何帮助。

3 个答案:

答案 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信号。