ViewController没有发布

时间:2010-12-31 01:39:29

标签: ios memory-management uiviewcontroller

每次我在我的应用程序中翻页时,我都会删除并释放之前的viewController - 但由于某种原因它仍然在内存中。我知道这一点,因为在使用应用程序一段时间后,我得到47个内存警告 - 每个视图控制器一个 - 如果我在发生内存警告之前打开了47页。如果在发生内存警告之前打开了60页,我会收到60个内存警告。等等...

这是从页面到页面运行的代码:

UIViewController *nextController;
Class nextClass = [pageClasses objectAtIndex:(currentPageIndex - 1)];
nextController = [[nextClass alloc] initWithNibName:[pageNibs objectAtIndex:(currentPageIndex - 1)] bundle:nil];
[nextController performSelector:@selector(setDelegate:) withObject:self];

[currentPageController.view removeFromSuperview];
[self.view addSubview:nextController.view];

[currentPageController release];
currentPageController = nextController;
[currentPageController retain];
[nextController release];

任何人都可以指出他们看到的任何问题吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

除此之外,请确保nil您的viewController在viewDidUnload中有任何出口,并且通常与viewDidLoad中的任何相应代码相反。我看到很多iOS代码没有这样做,它会停止运行时正确卸载视图控制器和相关视图。

答案 1 :(得分:0)

您是否在IB的Inspector中使用了“窗口属性”面板的“行为”和“记忆”部分?这是您通常控制内存使用和释放内容(代码本身之外)的地方。 尝试更改相关视图对象的值,以及窗口(或iPhone的任何内容)。

答案 2 :(得分:0)

我相信这是因为您在retain上呼叫currentPageController。我刚刚问了一个similar question,并对内存管理做了大量的澄清。

编辑:如果你做了类似的事情怎么办?

[currentPageController.view removeFromSuperview];
[currentPageController release];

Class nextClass = [pageClasses objectAtIndex:(currentPageIndex - 1)];
currentPageController = [[nextClass alloc] initWithNibName:[pageNibs objectAtIndex:(currentPageIndex - 1)] bundle:nil];
[currentPageController performSelector:@selector(setDelegate:) withObject:self];

[self.view addSubview:currentPageController.view];

它会稍微清理代码并且不会泄漏内存。