0

私は本当に苦労しています。それがどれほど簡単かは知っていますが、うまくいきません。

私はObj-Cに非常に慣れていません...

基本的に、このアプリはとてもシンプルです。

ユーザーが結果を取得する最後まで、モーダルView Controllerを重ねて積み上げます。その後、それらはすべて破棄され、ユーザーは再び開始できます。

各モーダル ビュー コントローラーで、たとえば、最初の画面で宣言した int に 1 を追加します。

これは、最初のビュー Controller.h の宣言です。

int total;

これは、2番目のView Controllerで行っていることです.m

FirstViewController *fvc = [[FirstViewController alloc] init];
[fvc setTotal:1]; //or the following, i can't see what the difference is
fvc.total = 1;

そして、これはうまくいくようです。別のビューで宣言した変数を設定します。

ただし、3番目のView Controller.mでは、次のようにします。

FirstViewController *fvc = [[FirstViewController alloc] init];
NSLog(@"Current total: %x", fvc.total);

エラーは発生しませんが、整数が0にリセットされたため、これは機能します。理想的には、値が保持されていることを示すために「1」と表示されます...

私の質問は; アプリ全体でこの整数を再利用して追加するにはどうすればよいですか?

私もそうしたいので、文字列に関連する回答もお願いします。

すみません、まだ勉強中です。

前もって感謝します。

4

2 に答える 2

0

変数を静的として定義すると、異なるインスタンス間でその値が保持されます。次のようにクラスでこれを行うことができます。

@interface FirstViewController : UIViewController

- (NSInteger)sharedValue;
- (void)setSharedValue:(NSInteger)value;

@end


@implementation FirstViewController

static NSInteger sharedValue = 0;

- (NSInteger)sharedValue
{
    return sharedValue;
}

- (void)setSharedValue:(NSInteger)value
{
    sharedValue = value;
}

@end

これで、作成した FirstViewController のインスタンスはすべて、sharedValue の同じコピーを共有し、それを 1 つに設定し、別のインスタンスから取得すると、思いどおりに動作します。文字列などでも同じプロセスが機能しますが、ARC を使用していない場合は、sharedValue の保持と解放に注意してください。

クラスに複数の静的な値を作成するよりも優れた方法は、複数のプロパティを設定および取得できる単一の共有クラスを作成することです。これらの共有クラスは、単一のインスタンスを持つクラスであるため、「シングルトン」と呼ばれることがあります。

[UIApplication sharedApplication]、[NSNotificationCenter defaultCenter]、[NSUserDefaults standardUserDefaults] など、Apple がシングルトンを使用する多くの場所を見ることができます。これらはすべて、アプリ全体で再利用される単一のインスタンスがあるクラスの例です。

シングルトンを作成するには、次のように NSObject 型の新しいクラスを作成します。次に、必要なプロパティを追加して、sharedInstance を介してアプリ内のどこからでもアクセスできます。

@interface MyObject : NSObject

@property (nonatomic, assign) NSInteger someInteger;
@property (nonatomic, strong) NSString *someString;

+ (MyObject *)sharedInstance;

@end


@implementation MyObject

@synthesize someInteger, someString;

+ (MyObject *)sharedInstance
{
    static MyObject *sharedInstance = nil;
    if (sharedInstance == nil)
    {
        sharedInstance = [[self alloc] init];
    }
    return sharedInstance;
}

@end

次のように言うことで、アプリのどこからでも共有プロパティにアクセスできるようになりました

[MyObject sharedInstance].someInteger = 5;

...

NSInteger value = [MyObject sharedInstance].someInteger;

これは間違いなく、アプリにグローバル データを保存する最良の方法です。

于 2012-04-04T22:34:45.703 に答える
0

alloc を使用するときはいつでも、新しいオブジェクトを作成しています。通常、新しいオブジェクトは、同じタイプのオブジェクトであるという理由だけで、別のオブジェクトに対して以前に何を行ったかを知りません。

一般的な戦略は、2 番目のビュー コントローラーを作成するときに既存の fvc への参照を与え、3 番目のビュー コントローラーを作成するときに同じ参照を与えることです。

(共有データを独自のオブジェクトに入れ、代わりにそれを渡す方が良いでしょうが、最初にオブジェクトの寿命の理論を制御してみましょう.:-))

于 2012-04-04T22:30:16.997 に答える