2009-05-18 20 views
0

これは基本的な質問ですが、私は良い答えを見つけることができません。私は複数のビューコントローラとアプリを持っていると私は、変数を作成した場合、一方のコントローラで、それに対してアクションを取ることに気づいた:私は初期化せずに別のコントローラで変数を宣言することができますiPhoneでの変数のメモリ管理

int foo = 0; 
foo =+ 1; 

それが運ぶ価値です値は、それが前のビューコントローラ内に最後に設定されました:

int foo; 
if (foo == 1) 
    doSomething; 

私は彼らのように、複数のコントローラ内のデータを使用して...マルチプレイヤーゲームなどにおける現在のプレーヤーのキープトラックのための私の利点にこれを使用していますビューが読み込まれ、削除されます。私はObj Cの新人です。これを読んでいることに基づいて、物事に正しい道がないように見えます。

これは私の質問です。これはコントローラ間でデータを渡す安全な方法ですか、そうでない場合はどうすればいいですか?

答えて

1

これはコントローラ間で情報をやりとりする安全な方法ではありません。アプリケーションでこれを使用していて、動作している場合、私は実際には非常に驚いています。

これを行う適切な方法は、実際に必要な値をあるコントローラから別のコントローラに渡すことです。以下の例では、アプリケーションデリゲートを使用して値を格納した後、各コントローラが読み書きを行います。これは単なる例です。アプリケーションデリゲートを有効なグローバル変数のリポジトリとして使用することに注意してください。この方法で使用するためにアプリケーション代理人に多くの変数を設定すると、アプリケーションの保守が困難になります。あなたのアプリのDelegate.m

@synthesize sharedInt; // this will automatically create the getters and setters 

あなたのApp Delegate.hで

@interface AppDelegate : NSObject <UIApplicationDelegate> { 
    int sharedInt; 
} 
@property int sharedInt; 

次にあなたが値を設定するコントローラで:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate]; 
applicationDelegate.sharedInt = 3; 

その後値を読み取るコントローラーで:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate]; 
if (applicationDelegate.sharedInt == 3) { 
    //do your stuff here 
} 

編集:@synthesizeを忘れてしまった。
編集は:コンパイラの警告を排除するために、ケネスBalleneggerからの提案に基づいて、デリゲートシングルトンメソッドからの戻りを入力しました。

+0

詳細な回答をいただきありがとうございます。これを初めて熟知して以来、本当に完全なコードが役立ちます。私はこれを実装し、それは素晴らしい作品です。ありがとう、 – Aaron

1

グローバル変数(Cが許す)を宣言しているかのように聞こえますが、ビューコントローラ間で値を渡すことはお勧めできません。

あなたの状態にオブジェクトがあり、それを必要とするコントローラに渡す必要があります。

1

私はmmcの答えに似た何かをする(そしてやる)ことをお勧めします。しかし、彼の答えはあなたに多くの警告をさせるでしょう。あなたは(id)オブジェクトだけでなく、AppDelegate *オブジェクトを取得していることを確認する必要があります(mmcのメソッドでやっているように)。

ちょうどそうのようなあなたのデリゲートに+singleton(または+sharedDelegate)クラスメソッドを追加します。

+ (iLaughAppDelegate *)singleton 
{ 
    iLaughAppDelegate *delegate = (iLaughAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    return delegate; 
} 
+0

優れた提案。私はしばしばこのパターンを使用しないで、はい、警告は私の神経に達していたでしょう。 – mmc

+0

ちょうど少しexpirimentationをした、と私はリターン、IDを使用するのではなく、シングルトンメソッドは実際に私のデリゲートクラス内にある必要はありません... UIApplication私のためにそれを処理するように見えます。 自分のコードを変更して、どこにそのアイディアがあるのか​​をメモしてください。 – mmc

+0

はい、うまくいくでしょう。しかし、戻り値を代入する前にキャストしなければ警告が表示されると思います。あなたの提案したコードでは、私はあなたがすることをお勧めします: ApplicationDelegateClassNameHere * applicationDelegate =(ApplicationDelegateClassNameHere *)[[UIApplication sharedApplication] delegate]; –

0

これが正しく行われていれば大丈夫ですが、唯一の読み取り専用データのために行われるべきです。これは、文字列定数を共有するための非常に一般的な方法です。たとえば:

MyObject.h

extern NSString* const MyObjectWillChangeNotification; 

MyObject.m

NSString* const MyObjectWillChangeNotification = @"MyObjectWillChangeNotification"; 

AnotherObject.m

#import "MyObject.h" 
// You can now use MyObjectWillChangeNotification in this file 

は、これと同じプロセスは、技術的にはあなたのintのために動作しますが、あなたはするべきでありません前にも述べたように、与えられた変数を1つのオブジェクトだけで管理できるようにする方がずっと安全です。誰もがアクセサーを介してそれにアクセスする必要があります。