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



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

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

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

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

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

在功能方面,示例应用程序做了它应该做的事情(即没有泄漏,并显示适当的视图),但是当我在Instruments Activity Monitor中查看应用程序时,随着您显示/隐藏三个不同的视图,使用的内存不断增加。

我花了两个星期的时间阅读,试图找出我没有正确释放的东西,但无济于事。有没有人可以看看我上传到github的项目,告诉我我在哪里出错了,我如何克服这个问题?

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

您正在泄漏PauseViews。

在你的游戏。在pausePressed方法中,您将创建PauseView类的新实例。当你把它作为子视图添加到某个东西时,它会被父视图保留。在pausePressed方法返回之后,您不再拥有对PauseView的引用,因此无法释放它。在一个相关的注意,在你的PauseView类的dealloc方法,你有"[self removeFromSuperview]"。这是没有意义的,因为如果它在那时有一个父视图,它将有一个至少为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

最新更新