iPhone - 释放资源的问题(xib / view / viewcontroller)

时间:2011-12-05 00:33:33

标签: iphone ios memory-management

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

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

在主页面上有一个按钮,可以将您带到游戏页面(带淡入/淡出动画)。

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

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

功能方面,示例应用程序执行它应该执行的操作(即没有泄漏并显示相应的视图),但是当我在Instruments Activity Monitor中查看应用程序时,正在使用的内存会随着显示/而不断增加隐藏三种不同的观点。

我花了两周的时间阅读并试图找出我没有正确发布的内容无济于事。有人可以看看我上传到github的项目并告诉我哪里出错了以及如何克服这个问题?

如果需要,我很乐意提供更多信息/说明。请注意我已针对iOS4。

1 个答案:

答案 0 :(得分:1)

您正在泄漏PauseViews。

在您的GAME.m文件中,在pausePressed方法中,您将创建PauseView类的新实例。当您将其作为子视图添加到某个内容时,它将被超级视图保留。在pausePressed方法返回后,您不再具有对PauseView的引用,因此无法释放它。在相关的说明中,在PauseView类的dealloc方法中,您有“[self removeFromSuperview]”。这没有意义,因为如果它在那时有一个superview,它将有一个至少为1的retainCount,但是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。