我已编写代码,当您点击按钮时,它会打开包含图像的新屏幕。在那个新屏幕上有一个关闭屏幕的按钮,然后返回主屏幕。如果我这样做(没有泄漏等......),它的工作正常:
img = [UIImage imageNamed: @"Galaxy"];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];
但是,如果我用这样的代码替换这行代码:
img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Minnesota" ofType:@"png"]];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];
[img release];
它充当我的内存泄漏。每次我打开图像屏幕,应用程序都会占用越来越多的内存。但所有dealloc都被调用,甚至[img retainCount]在最终发布之前显示1。这里是否有可能存在错误,因为我找不到什么错误?
编辑:
这是ImageDisplay的dealloc方法,此方法被调用:
-(void) dealloc {
[img release];
[super dealloc];
}
答案 0 :(得分:3)
您的ImageDisplay *display
正在保留图片。应该如此。当您释放它时,它应该释放所有保留的实体。在你展示的代码中,你没有发布它。典型的用途是告诉包含视图控制器以模态或其他方式显示它(或将其推送到导航控制器上)并释放它,将其保留生命周期留在现在管理它的任何视图控制器的手中。不同之处在于,在您的第一个代码示例中,*img
是自动释放的,并且会在适当的时候自行释放,而在第二个代码示例中,它不是。
ARC会在这里保存您的培根,并大大简化您的代码。
另外你应该谷歌术语“静态方法”,因为你真的很难将静态方法称为对象类的实例,就像绕过你的屁股来到达你的肘部。
另外,请停止查看retainCount
。各种各样的东西可能会将您的对象保留在框架的底层。使用retainCount作为调试策略的一部分是confusionville的单程票。
答案 1 :(得分:0)
请注意,由于imageNamed:是一个类方法而不是实例方法,因此您可以像这样使用它:
UIImage *myImage = [UIImage imageNamed:@"pony.png"];
使用initWithContentsOfFile
发布的代码看起来是正确的,因此泄漏必须位于ImageDisplay类的某个位置。
答案 2 :(得分:0)
尝试使用这个,你不需要分配和释放:
[UIImage imageWithContentsOfFile:(NSString *)name]