- viewDidLoad 无限循环问题...(iOS)

Posted

技术标签:

【中文标题】- viewDidLoad 无限循环问题...(iOS)【英文标题】:- viewDidLoad infinite loop issue...(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 继承? 【参考方案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 viewDid/WillLoad/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 中访问它,也会发生这种情况 您必须重命名该属性。

【讨论】:

以上是关于- viewDidLoad 无限循环问题...(iOS)的主要内容,如果未能解决你的问题,请参考以下文章

Objective C如何在从第一个VC移动到第二个时停止无限循环

使用没有无限循环的 C++ i 检测文本文件中的更改?

x86-64 汇编器中的无限循环

无限“for i,v in pairs(table) do”循环?

从代码中删除警报会强制其进入无限循环

C++ 无限for循环的bug