【问题标题】:- viewDidLoad infinite loop issue...(iOS)- viewDidLoad 无限循环问题...(iOS)
【发布时间】:2011-02-13 18:46:37
【问题描述】:

我正在尝试在 iOS 中编写一个多视图应用程序,并且确实遇到了一些困难......我已经设置了一个新项目,并且我有一个 rootViewController 正在由 appDelegate 启动。反过来,rootViewController 会尝试加载和显示我的第一个内容视图,虽然我似乎陷入了某种无限循环,但我希望这里的人可能对为什么会有预感......

    -(void)viewDidLoad
{   
    // Load up new instance of view
    TopLevelViewController *topLevelController = 
    [[TopLevelViewController alloc] initWithNibName:@"TopLevelView" bundle:nil];

    // Hand off viewController reference to root controller
    self.topLevelViewController = topLevelController;

    // Display the view
    [self.view insertSubview:topLevelController.view atIndex:0];

    // Release viewController
    [topLevelController release];


    [super viewDidLoad];
}

上面是我的rootViewController viewDidLoad: 方法,虽然每次执行insertSubview,它似乎都回到了顶部,再次执行整个事情。我有点困惑,因为我将这段代码几乎完全基于我遵循的教程并且运行良好......这让我认为问题一定出在其他地方,尽管我想不出在哪里。

欣赏任何见解!

【问题讨论】:

  • 你的 rootViewController 不是 TopLevelViewController 类型的吗?
  • @lxt 不,它是 RootViewController 类型的,尽管我确实想过!
  • 你认为为什么会出现无限循环?尝试删除[topLevelController release];行 - 我认为你不应该在那个地方释放控制器......
  • @Vladimir:假设topLevelViewController 属性保留了它,他应该释放它。否则会泄露。
  • 您的topLevelViewController 是否会从rootViewController 继承?

标签: iphone objective-c xcode ipad ios


【解决方案1】:

我遇到了同样的问题,花了一段时间才弄清楚。

当 self.view 不存在时,iOS 会调用 loadview/viewdidload 并尝试创建视图。这会导致死循环。在我的情况下,我没有在我的 loadView 中调用 [super loadView],并导致了这个问题。

查看此讨论 http://forums.macrumors.com/showthread.php?t=552520

【讨论】:

  • 官方api文档清楚地说明了“loadView”方法:“你自定义的这个方法实现不应该调用super。”。
  • @Jagie 你能详细说明一下吗?我想听取您的建议,但添加 [super loadView]; 确实解决了我的问题。谢谢。
【解决方案2】:

viewDidLoad上设置断点,继续几次,然后抓取回溯并发布。

另外,将NSLog(@"%@ self is %p", NSStringFromSelector(_cmd), self); 添加到viewDidLoad 的开头。可能是您创建了一种 nib 文件的“无限镜像”配置;如果十六进制数不断变化,那将是您视图的不同实例。

【讨论】:

  • 你得到的 GCC 回溯应该足以告诉你是什么导致了循环。
【解决方案3】:

我知道这听起来很简单,但请尝试移动

[super viewDidLoad]

到代码的顶部。我有一种感觉,超级必须是你打电话的第一件事。

【讨论】:

  • 这是正确答案。 [super viewDidLoad](与[super loadView] 相同,以及所有[super view{Did/Will}{Load/Unload}:animated] 方法)需要在您的覆盖方法中绝对排在第一位,除非您有一个已知且特定的理由不这样做。否则self.view 不存在,并且调用对其进行操作的方法有可能调用viewDidLoadloadView,这是您调用的方法,因此是无限循环。
【解决方案4】:

刚刚意识到在最近的兴趣之后我从未关闭过这个。

我记得,@Wolfgang Schreurs 完全正确。无论出于何种原因,在试验代码时,我让 topLevelViewController 继承自 rootViewController

希望这对可能遇到相同问题的其他人有所帮助。

【讨论】:

    【解决方案5】:

    我删除了 loadView 方法,它为我修复了它,如果您的 .m 文件中有该方法,请删除它!!

    【讨论】:

      【解决方案6】:

      试试[self.view addSubview:topLevelController.view]

      【讨论】:

      • 收到警告说“'UIView' 可能无法响应 '-insertSubview:'”并且仍然存在问题。
      • 他说的是-addSubview:,而不是-insertSubview:。你打错字了。 ;p
      • @Jonathan Grynspan 呃,谢谢你指出这一点,我想我已经盯着这个太久了!
      【解决方案7】:

      设置断点并查看循环运行的位置...

      【讨论】:

        【解决方案8】:

        如果您创建 @property (nonatomic, strong) UIView *loadView 并在 viewDidLoad 中访问它,也会发生这种情况 您必须重命名该属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-03
          • 2021-09-02
          • 2020-09-09
          • 2021-09-11
          • 2018-09-24
          • 1970-01-01
          • 2023-03-28
          相关资源
          最近更新 更多