我已经写了代码,当你点击按钮,它会打开新的屏幕上的图像。在新屏幕上有一个按钮,用于关闭屏幕并返回到主屏幕。如果我这样做(没有泄漏等),它工作得很好:
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];它就像我有内存泄漏一样。每次打开图像屏幕,应用程序都会占用越来越多的内存。但是所有的retainCount都是被调用的,甚至img在最终发布之前都会显示1。有没有可能这里有个bug,因为我找不到问题所在?
编辑:
下面是ImageDisplay的dealloc方法,该方法被调用:
-(void) dealloc {
[img release];
[super dealloc];
}发布于 2012-02-25 00:37:12
您的ImageDisplay *display将保留该图像。它应该是这样的。当您释放它时,它应该释放它保留的所有实体。在您所展示的代码中,您并没有发布它。典型的用法是告诉包含它的视图控制器以模态或其他方式显示它(或将它推到导航控制器上)并释放它,将其保留生命周期留给现在管理它的任何视图控制器。不同之处在于,在您的第一个代码示例中,*img是自动发布的,并且会在适当的时候自动发布,而在第二个代码示例中,它不会。
ARC将在这里保存您的培根,并极大地简化您的代码。
你也应该在谷歌上搜索“静态方法”这个词,因为你真的很努力地把静态方法作为对象类的实例来调用,这就像绕着你的臀部到你的手肘一样。
另外,不要再看retainCount了。各种各样的东西可能会将你的对象保留在框架的引擎盖下。使用retainCount作为调试策略的一部分是通向confusionville的单行票。
发布于 2012-02-25 00:30:49
请注意,由于imageNamed:是一个类方法,而不是一个实例方法,所以您可以这样使用它:
UIImage *myImage = [UIImage imageNamed:@"pony.png"];您发布的使用initWithContentsOfFile的代码看起来是正确的,所以泄漏一定是在您的ImageDisplay类中的某个地方。
发布于 2012-02-25 00:32:45
试着使用这个,你不需要分配和释放:
[UIImage imageWithContentsOfFile:(NSString *)name]https://stackoverflow.com/questions/9434247
复制相似问题