我正在利用自己的时间学习objective-C并创建我的第一个iPhone应用程序,但是我似乎在释放分配给我的视图的内存时遇到了问题。我认为问题本身包含了很多代码,所以我创建了一个小示例应用程序,并将代码上传到github (此处:https://github.com/MatthewStacey/PauseTest)。
在示例应用程序中,我有三个视图,一个主页面,一个游戏页面和一个暂停视图。
在主页上有一个按钮,它会带你到游戏页面(带有淡入/淡出动画)。
在游戏页面上有一个按钮,将显示暂停视图(UIView)。
在暂停视图上有两个按钮,一个用于隐藏视图并离开显示的游戏页面,另一个用于显示主菜单。
功能方面,示例应用程序做了它应该做的事情(即没有泄漏,并且显示了适当的视图),但是,当我在Instruments Activity Monitor中查看该应用程序时,随着您显示/隐藏三个不同的视图,所使用的内存会不断增加。
我花了两周的大部分时间阅读并试图找出我没有正确发布的东西,但没有用。有没有人可以看看我上传到github上的项目,告诉我哪里出了问题,以及如何克服这个问题?
如果需要的话,我很乐意提供更多的信息/澄清。请注意,我的目标是iOS4。
发布于 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方法尝试如下所示:
- (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。
https://stackoverflow.com/questions/8379775
复制相似问题