2012-04-04 15 views
5

私はiOSアプリケーションを持っています。アプリケーションには、メインと設定の2つのビューがあります。実際には、メインビューで使用する前に、ライブラリとフレームワークをロードして初期化する必要があります。iOS関数を一度呼び出す(アプリケーションを初期化する)

この初期化をviewDidLoadメソッドに入れると、正常に動作します。しかし、設定に行き、メインビューに戻ると、初期化が再び開始されます。これは私が望んでいないものであり、アプリケーションではメモリの問題が発生します。

アプリケーションの起動時に一度呼び出されるメソッドが必要です。何か案が?

編集:タブ表示に切り替えました。ビューを一度ロードします。これは別の解決策です。

答えて

7

使用すると、この1:

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

それはあなたのappdelegateクラスでなければなりません。

は、それはあなたがapplication:didFinishLaunchingにこのコードを入れたくないとあなたがのviewDidLoadでそれを維持したいあなたのコメントの一つに

+0

しかし、あなたのアプリケーションの迅速な立ち上げのためにあなたがRを避けなければなりません'didFinishlaunchingWithOptions'の中に大きなスレッドを作ります – iDroid

+1

私は@chiLLerに同意します。 ViewControllerの内部で呼び出すメソッドが必要です。 – mert

+1

あなたはあなたのアプリケーションを最初に起動することは、あなたが物事を正しく初期化する必要があることを意味しました。あなたが 'viewDidLoad'の中でそれを行うのであれば、それをロードするたびに呼び出されます。ここで必要なのは、あなたがそれを開かれたかどうかを覚えておくことです。このためには、plistまたはNSUserDefaultのキー値のペアまたは 'appDelegate'のグローバル変数を維持して、状態を覚えておくことができます。 – iDroid

28

あなたの状態に役立ちます願っています。このスニペットを使用してコードを実行することができます。最初のコードのみが呼び出されます。

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

内部ブロックは1回だけ実行されます。ビューが再びロードされた場合、ブロックは呼び出されません。エディタでdispatch_onceを入力するために開始することでアクセスすることができ、このためのXcodeのコードスニペットがあることに注意してください:あなたのAppDelegate

enter image description here

enter image description here

+0

本当に素晴らしい答え@Mikke Weller – iDroid

+0

スレッドセーフな例ありがとう – Sergei

0

、一つだけを持っていることが保証対象の一つインスタンス(シングルトン)アプリを通じて、あなたはインスタンス変数/プロパティを宣言することができます。 あなたUIViewControllerviewDidLoadBOOL initialized;

そして、あなたCHコードが初期化されている場合はeckしてください。ない場合は、コードを実行し、trueに変数を設定します。

if (!initialized) { 
    // Code goes here 
    initialized = true; 
} 
関連する問題