我正在用自己的时间学习 Objective-C 并创建我的第一个 iPhone 应用程序,但是我似乎在释放分配的 View 的内存时遇到问题。我认为问题本身包含太多代码,因此我创建了一个小型示例应用程序并将代码上传到 github(此处: https://github.com/MatthewStacey/PauseTest )。
在示例应用程序中,我有三个 View :一个主页、一个游戏页面和一个暂停 View 。
主页上有一个按钮,可带您进入游戏页面(带有淡入/淡出动画)。
在游戏页面上有一个按钮将显示暂停 View (UIView)。
在暂停 View 上有两个按钮,一个将隐藏 View 并保留显示游戏页面,另一个将显示主菜单。
在功能方面,示例应用程序执行了它应该执行的操作(即没有泄漏并且显示了适当的 View ),但是当我在仪器事件监视器中查看该应用程序时,所使用的内存随着您的显示而不断增加/隐藏三个不同的 View 。
我花了两周的时间阅读并试图找出我没有正确发布的内容,但无济于事。有人可以看一下我上传到 github 的项目并告诉我哪里出了问题以及如何克服这个问题吗?
如果需要,我很乐意提供更多信息/说明。请注意,我的目标是 iOS4。
最佳答案
您正在泄漏 PauseViews。
在 GAME.m 文件的pausePressed 方法中,您创建PauseView 类的新实例。当您将其作为 subview 添加到某些内容时,它会被 super View 保留。在pausePressed方法返回后,您不再拥有对PauseView的引用,因此无法释放它。相关说明,在 PauseView 类的 dealloc 方法中,您有“[self removeFromSuperview]”。这是没有意义的,因为如果此时它有一个 super View ,那么它的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。
关于iPhone - 释放资源时出现问题(xib/view/viewcontroller),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8379775/