- 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
不存在,并且调用对其进行操作的方法有可能调用viewDidLoad
或loadView
,这是您调用的方法,因此是无限循环。【参考方案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移动到第二个时停止无限循环