4

我发现了一个案例,在应用程序委托中的应用程序 didFinishLaunching 方法之前调用了我的一些视图控制器的 initWithCoder 方法。(我已经通过设置断点并查看调用顺序来确认这一点)

我正在使用故事板。UITabBarController 是初始视图控制器。部分问题在于情节提要以未知的顺序创建对象;也许它是在应用程序启动之前创建视图控制器。

无论如何,问题是我正在注册初始用户默认值。这必须在程序的任何部分查看它们之前发生。因此,我试图找到保证首先执行注册代码的位置。

有没有这样的地方?

注意:这个线程讨论了一点,但没有真正的结论......

ViewDidLoad 在 AppDelegate didFinishLaunchingWithOptions 被执行之前运行!

4

2 回答 2

4

初始化用户默认值的标准方法是在应用程序委托中的“+(void)initialize”方法中:

+ (void)initialize
{
    if(self == [MyAppDelegate class]) {
        ...
    }
}

这保证在任何委托方法收到消息之前运行。

PS:在从该方法返回之前,我在 didLaunch 方法中实例化了一大堆 viewController。

于 2012-08-07T17:39:41.557 回答
0

这是很自然的(也是使用 InterfaceBuilder 很糟糕的原因之一)。在 application:didFinishLaunchingWithOptions: 中,您通常依赖已经从相应的 NIB/XIB 文件创建的主窗口和主视图控制器。两种解决方案:

一(首选):在应用程序中手动实例化东西:didFinishLaunchingWithOptions:。因此,您可以控制任何初始化的执行顺序。

二:使用__attribute__((constructor(XXX)))函数——它们保证在main之前被调用,并且XXX数字越小,特定的构造函数被调用的越早。然而,这种方法是不可取的,因为它不是标准的 C(只是一个编译器扩展),而且它也很容易变得非常混乱。

于 2012-08-07T17:27:28.323 回答