iPhone - 释放资源时出现问题(xib/view/viewcontroller)

标签 iphone ios memory-management

我正在用自己的时间学习 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/

相关文章:

iphone - AVAssetReader 读取视频样本的基本问题

ios - Swift 协议(protocol)不起作用

c++ - 有没有办法告诉 openmp 共享数据是不变的?

iphone - 检测 AVAudioSession 何时为 "Ducked"

iphone - iphone os 框架本身会抛出 NSException 吗?

iphone - 以编程方式将图像粘贴到图像上

objective-c - 以编程方式自动锁定 iPhone

iOS:为什么在自定义 TableViewCell 中写入此文本字段的文本似乎不可读

ios - 使用 Swift 对 NSString 的结果数组进行排序,出现内存不足警告

java - 调用 intern() 方法后,内存中的新 String() 对象何时会被清除