首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone -释放资源时出现问题(xib/视图/视图控制器)

iPhone -释放资源时出现问题(xib/视图/视图控制器)
EN

Stack Overflow用户
提问于 2011-12-05 08:33:33
回答 1查看 164关注 0票数 0

我正在利用自己的时间学习objective-C并创建我的第一个iPhone应用程序,但是我似乎在释放分配给我的视图的内存时遇到了问题。我认为问题本身包含了很多代码,所以我创建了一个小示例应用程序,并将代码上传到github (此处:https://github.com/MatthewStacey/PauseTest)。

在示例应用程序中,我有三个视图,一个主页面,一个游戏页面和一个暂停视图。

在主页上有一个按钮,它会带你到游戏页面(带有淡入/淡出动画)。

在游戏页面上有一个按钮,将显示暂停视图(UIView)。

在暂停视图上有两个按钮,一个用于隐藏视图并离开显示的游戏页面,另一个用于显示主菜单。

功能方面,示例应用程序做了它应该做的事情(即没有泄漏,并且显示了适当的视图),但是,当我在Instruments Activity Monitor中查看该应用程序时,随着您显示/隐藏三个不同的视图,所使用的内存会不断增加。

我花了两周的大部分时间阅读并试图找出我没有正确发布的东西,但没有用。有没有人可以看看我上传到github上的项目,告诉我哪里出了问题,以及如何克服这个问题?

如果需要的话,我很乐意提供更多的信息/澄清。请注意,我的目标是iOS4。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-05 10:47:54

你泄露了PauseViews。

在GAME.m文件的pausePressed方法中,创建PauseView类的新实例。当您将其作为子视图添加到某个对象时,它将被superview保留。在pausePressed方法返回后,您不再具有对PauseView的引用,因此无法释放它。另外,在你的PauseView类的dealloc方法中,你有"self removeFromSuperview“。这是不合理的,因为如果它在那个时候有一个superview,它的retainCount将至少为1,但是dealloc从一开始就不会被调用。在PauseView的dealloc方法中放置一个断点,您将看到它永远不会被调用。

我使用以下方法找到它:http://useyourloaf.com/blog/2011/3/8/using-heapshots-to-find-abandoned-memory.html

为您的PauseView创建一个ivar,并对您的pausePressed方法尝试如下所示:

代码语言:javascript
复制
- (IBAction) pausePressed
{
    CGRect startFrame = CGRectMake(0, -500, 320, 480);
    if (!pv) {
        pv = [[PauseView alloc] initWithFrame: startFrame :10 :3];
        [pv setDelegate: self];
        [self.view addSubview:pv];
    }
    pv.frame = startFrame;
    [pv showPauseView];
}

别忘了在dealloc中释放ivar。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8379775

复制
相关文章

相似问题

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