5

我有一个 iOS 应用程序。应用程序有 2 个不同的视图:主视图和设置视图。实际上,应用程序在主视图中使用之前需要加载和初始化一些库和框架。

当我将此初始化放入viewDidLoad方法中时,它可以正常工作。但是当转到设置并返回主视图时,初始化再次开始,这不是我想要的,并且应用程序导致内存问题。

我需要一个在应用程序启动时调用一次的方法。任何想法?

编辑:我切换到选项卡式视图。它加载一次视图。这是另一种解决方案。

4

4 回答 4

28

您在其中一条评论中声明您不想将此代码放入其中,application:didFinishLaunching并且希望将其保留在 viewDidLoad 中。您可以使用此代码段仅在第一次调用时运行您的代码:

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    // code here
});

内部块只会执行一次。如果再次加载视图,则不会调用该块。请注意,有一个 Xcode 代码片段,您可以通过开始dispatch_once在编辑器中输入来访问它:

在此处输入图像描述

在此处输入图像描述

于 2012-04-04T07:00:47.190 回答
7

使用这个:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

它应该在您的 appdelegate 类中。

希望能帮助到你

于 2012-04-04T06:40:30.130 回答
2

你也可以使用

+ [NSObject initialize]

定义该名称的类方法,它将在任何其他消息发送到该类之前运行一次:

+ (void)initialize {
  // Put one-time initialization code here.
}

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/clm/NSObject/initialize

于 2012-06-06T22:30:58.950 回答
0

在您的AppDelegate,其中一个对象保证在整个应用程序中只有一个实例(单例),您可以声明一个实例变量/属性: BOOL initialized;

然后在viewDidLoad你的UIViewController,你检查它的代码是否已经被初始化;如果不是,则运行代码并将变量设置为 true:

 if (!initialized) {
    // Code goes here
    initialized = true;
 }
于 2012-04-04T07:01:36.123 回答