首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone/iPad UIImage initWithContentsOfFile:

iPhone/iPad UIImage initWithContentsOfFile:
EN

Stack Overflow用户
提问于 2012-02-25 00:22:16
回答 3查看 1.8K关注 0票数 0

我已经写了代码,当你点击按钮,它会打开新的屏幕上的图像。在新屏幕上有一个按钮,用于关闭屏幕并返回到主屏幕。如果我这样做(没有泄漏等),它工作得很好:

代码语言:javascript
复制
img = [UIImage imageNamed: @"Galaxy"];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];

但是如果我用下面这样的代码替换这行代码:

代码语言:javascript
复制
img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Minnesota" ofType:@"png"]];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];
[img release];

它就像我有内存泄漏一样。每次打开图像屏幕,应用程序都会占用越来越多的内存。但是所有的retainCount都是被调用的,甚至img在最终发布之前都会显示1。有没有可能这里有个bug,因为我找不到问题所在?

编辑:

下面是ImageDisplay的dealloc方法,该方法被调用:

代码语言:javascript
复制
 -(void) dealloc {
     [img release];
     [super dealloc];
 }
EN

回答 3

Stack Overflow用户

发布于 2012-02-25 00:37:12

您的ImageDisplay *display将保留该图像。它应该是这样的。当您释放它时,它应该释放它保留的所有实体。在您所展示的代码中,您并没有发布它。典型的用法是告诉包含它的视图控制器以模态或其他方式显示它(或将它推到导航控制器上)并释放它,将其保留生命周期留给现在管理它的任何视图控制器。不同之处在于,在您的第一个代码示例中,*img是自动发布的,并且会在适当的时候自动发布,而在第二个代码示例中,它不会。

ARC将在这里保存您的培根,并极大地简化您的代码。

你也应该在谷歌上搜索“静态方法”这个词,因为你真的很努力地把静态方法作为对象类的实例来调用,这就像绕着你的臀部到你的手肘一样。

另外,不要再看retainCount了。各种各样的东西可能会将你的对象保留在框架的引擎盖下。使用retainCount作为调试策略的一部分是通向confusionville的单行票。

票数 3
EN

Stack Overflow用户

发布于 2012-02-25 00:30:49

请注意,由于imageNamed:是一个类方法,而不是一个实例方法,所以您可以这样使用它:

代码语言:javascript
复制
UIImage *myImage = [UIImage imageNamed:@"pony.png"];

您发布的使用initWithContentsOfFile的代码看起来是正确的,所以泄漏一定是在您的ImageDisplay类中的某个地方。

票数 0
EN

Stack Overflow用户

发布于 2012-02-25 00:32:45

试着使用这个,你不需要分配和释放:

代码语言:javascript
复制
 [UIImage imageWithContentsOfFile:(NSString *)name]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9434247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档