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

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

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

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

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

在功能上,示例应用程序按照预期的方式运行(即没有泄漏,并显示了适当的视图),但是,当我在Instruments Activity Monitor中查看该应用程序时,随着您显示/隐藏这三个应用程序,正在使用的内存不断增加不同的看法。

我花了两个星期的大部分时间来阅读,并试图弄清楚我没有正确发布的内容没有任何用处。有人可以看看我上传到github的项目,并告诉我哪里出了问题以及如何解决这个问题?

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

最佳答案

您正在泄漏PauseViews。

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

07-27 22:24