Xcode 4 - viewDidLoad 问题

Posted

技术标签:

【中文标题】Xcode 4 - viewDidLoad 问题【英文标题】:Xcode 4 - viewDidLoad issue 【发布时间】:2011-03-11 21:16:03 【问题描述】:

还有其他人对 Xcode 4 有问题吗?viewDidLoad 被调用了两次?我在 Xcode 3.2 和 Xcode 4 中都运行了同一个项目,它只在 Xcode 4 中起作用。

【问题讨论】:

您的 viewDidLoad 是仅针对特定的 UIViewController 还是针对您的所有视图控制器被调用两次?另外,你怎么知道它在同一个 viewController(断点、nslog)上被调用了两次?为了确保它是同一个 UIViewController,你能不能在 viewDidLoad. %p 将显示对象的十六进制地址。 断点和 nslog 语句。它只发生在 xcode 4 中,我昨晚下载了 3.2.6,项目在那里运行良好。当应用程序首次启动时,它只是我的 rootviewcontroller。在我完成测试并将其推送到应用商店后,我将再次尝试 xcode 4 和您提到的日志语句。我真的认为它的 xcode 4,它是一个带有单独笔尖的通用应用程序,并且在启动时它们正在加载完全不同的代码,但它在两者中都会发生,并且在我的 ipad 应用程序中没有什么新东西,它已经过苹果的全面测试和批准。 我很想知道当您再次解决问题时这些 NSLog 会发生什么。祝一切顺利。 我遇到了同样的问题。 @Caleb,请记住,从 Xcode 3 到 Xcode 4 的编译器发生了很大的变化。Xcode 不仅仅是“一个 IDE”,还包括很多其他的东西。视图控制器的实例始终相同,这不是多视图控制器问题:视图确实加载了 视图确实加载了 是的,到目前为止我已经切换到 3.2.6 并且运行我的代码并提交到应用商店没有问题。我要等到 xcode 4 的下一个版本才能切换。 【参考方案1】:

在Apple Developer forums 上对此进行研究后,似乎在某些情况下 Xcode 4 会创建错误的 Interface Builder NIB。结果是应用程序的 rootViewController 被加载了两次,这真的把事情搞砸了。在 Xcode 3 中加载的同一个项目不会出现问题。

在我的通用应用程序中,它只影响了 iPad NIB。 iPhone 很好。

我能够通过以下方式解决此问题:

在 Interface Builder 中删除 rootViewController 连接(这会导致应用以 window.rootViewController = nil 加载) 在主控制器的 viewDidLoad 中(被加载两次的那个),然后我手动分配 appDelegate.window.rootViewController = self

到目前为止,这似乎达到了预期的效果。

【讨论】:

【参考方案2】:

Xcode 只是一个 IDE——它不应该对应用程序执行时发生的事情有任何影响。如果存在差异,您似乎更有可能针对不同的 ios 版本进行构建。

【讨论】:

感谢您的回复。我知道 xcode 只是一个 ide.. 我是目标 4.2 并在 xcode 4 和 3.2.6 中使用 4.3 sdk 构建,我只有 xcode 4 有问题。即使我为不同版本构建我的 viewdidload 也不应该被调用在我的应用程序完成启动之前两次,没有任何内存警告或任何东西。 我建议在 bugreporter.apple.com 提交错误报告。【参考方案3】:

你设置了视图控制器的视图吗?我有同样的问题,我意识到我没有设置视图属性。

- (void)viewDidLoad 
    UIView *contentView = [[UIView alloc] initWithFrame: [[UIScreen mainScreen] applicationFrame];
    //add some stuff to contentView here
    self.view = contentView;
    [contentView release];

【讨论】:

【参考方案4】:

我有同样的问题。我解决了它。当您的应用内存确实收到内存警告时,就会发生这种情况。

在 memoryDidReceiveWarning 中设置一个断点。它被调用,并清除您的类对象内存。所以你的 viewDidLoad 被调用了两次,因为当时没有内存。

【讨论】:

以上是关于Xcode 4 - viewDidLoad 问题的主要内容,如果未能解决你的问题,请参考以下文章

在 viewDidLoad 上播放声音 - Xcode

Xcode Playground 中的 ViewController - 帧报告双倍大小 (viewDidLoad)

Cocoa xcode 4.3 全局变量

Xcode 9.4.1:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

viewDidLoad 函数未在 Xcode 6.2 swift 应用程序中调用,但在 OS X 上的 Xcode 6.4 swift 应用程序中调用

Clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)Xcode 10、Xcode 10.1 Beta、Swift 4.2