Ios 内存泄漏,多个UIViewController的其他问题

Ios 内存泄漏,多个UIViewController的其他问题,ios,ipad,uiviewcontroller,Ios,Ipad,Uiviewcontroller,我们从Xcode中基于窗口的应用程序开始。在'AppDelegate'中,我们有 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { MainMenuViewController *mvc = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewCo

我们从Xcode中基于窗口的应用程序开始。在'AppDelegate'中,我们有

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    MainMenuViewController *mvc = [[MainMenuViewController alloc] initWithNibName:@"MainMenuViewController" bundle:nil];
    self.window.rootViewController = mvc;
    [mvc release];
    [self.window makeKeyAndVisible];
    return YES;
}
MainMenuViewController
可以创建其他几个
UIViewController
派生类之一,也允许用户返回主菜单。在
MainMenuViewController
中,我们有以下内容:

SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil];
[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];
SecondLevelViewController
有类似的代码返回主菜单。这是可行的,但在来回多次之后,最终创建了这两个类的一组实例,显然需要以其他方式完成。虽然Instruments没有报告任何内存泄漏,但应用程序的总内存使用量继续增长,并且视图控制器的实时分配实例数量也在增长

我们认为调用
removeFromSuperview
会取消分配以前的视图控制器,但这并没有发生,尽管文档中说应该这样做

我们还注意到需要调用
release

SecondLevelViewController* slvc = [[SecondLevelViewController alloc]initWithNibName:@"SecondLevelViewController" bundle:nil];
[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];
[slvc release];  // < < < added this line
SecondLevelViewController*slvc=[[SecondLevelViewController alloc]initWithNibName:@“SecondLevelViewController”bundle:nil];
[self.view.window addSubview:slvc.view];
[self.view removeFromSuperview];
[slvc发布];//<<增加了这一行
但这导致
SIGABRT
无法识别的选择器被发送到…


UINavigationViewController
对我们来说不太管用,因为用户需要能够返回主菜单,无论他在菜单继承权中的位置有多深。

如果仍然有对它的引用,这就不是泄漏。请尝试Heapshot,下面有一个很棒的教程:

在:

您只是使用
slvc
来创建
slvc.view
,既然不需要ViewController,为什么不创建视图呢

回复:UINavigationViewController对我们来说不太合适 你有没有看过:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated


如果仍有引用,则不属于泄漏。请尝试Heapshot,下面有一个很棒的教程:

在:

您只是使用
slvc
来创建
slvc.view
,既然不需要ViewController,为什么不创建视图呢

回复:UINavigationViewController对我们来说不太合适 你有没有看过:

- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated


有机会的话我会去看看Heapshot的,谢谢。至于为什么要使用视图控制器,我对苹果文档的理解是,视图控制器处理每一屏数据。还有相关的NIB文件等问题。我会在有机会时查看Heapshot,谢谢。至于为什么要使用视图控制器,我对苹果文档的理解是,视图控制器处理每一屏数据。还有相关的NIB文件等问题。
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated