【问题标题】:What is wrong with this code? Trying to load a navController onto a modal view controller这段代码有什么问题?试图将 navController 加载到模态视图控制器上
【发布时间】:2011-08-03 13:31:52
【问题描述】:

我有一个 UIViewcontroller,我想将它推送到 UINavigationController,然后它会使用 presentModalViewController:animated 推送到模态视图。

这是我的代码:

TargetViewController *targetViewController = [[[TargetViewController alloc] init] autorelease];
UINavigationController *targetNavController = [[[UINavigationController alloc] initWithRootViewController:targetViewController] autorelease];
[self presentModalViewController:targetNavController animated:YES];

代码运行时,模态视图按预期加载,但在调用dismissModalViewControllerAnimated:后,模态视图滑下,应用崩溃。

我在 gdb 中收到以下错误: -[CALayer retain]:消息发送到释放的实例

问题的第一部分:上面的代码有什么固有的错误吗?

第二部分:如果上面的代码没有问题,我应该在哪里调试?

其他信息: 当我释放或自动释放导航控制器时,它工作正常。但是 Instruments 会显示废弃的内存,我只能假设 navController 没有被释放。也许是模态视图控制器

附:我知道崩溃与上述 ViewController、navController 和模态视图的内存管理有关,因为我的代码在弄乱这段代码之前就已经工作了。

【问题讨论】:

    标签: ios memory-management uinavigationcontroller modalviewcontroller


    【解决方案1】:

    您通常不会将 navController 作为视图推送,因为导航控制器作为根控制器工作。视图是从 navController 推送的。一旦你推送了一个视图,你就可以模态地呈现下一个视图。

    【讨论】:

      【解决方案2】:

      如果你不使用autorelease会发生什么?

      IE:

      TargetViewController *targetViewController = [[TargetViewController alloc] init];
      UINavigationController *targetNavController = [[UINavigationController alloc] initWithRootViewController:targetViewController];
      [targetViewController release];
      [self presentModalViewController:targetNavController animated:YES];
      [targetNavController release];
      

      【讨论】:

      • 使用上述代码时,targetViewController 会按预期加载,但是当它关​​闭时(调用 dismissModalViewControllerAnimated),应用程序崩溃,并且我收到了我在帖子中包含的错误消息。
      【解决方案3】:

      解决了这个问题。我正在释放 VC,导致崩溃。感谢您的意见。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 2012-03-06
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        相关资源
        最近更新 更多