1

strName、strNo、intPassword ...などの多くの値を保持するための特別なクラスを作成して、他のいくつかのクラスがこのクラスの同じ値を変更できるようにします。ドット構文を使用して、次のようなプロパティを呼び出したい

Values.strName = ...; 
一部の値はまだ使用されているため、値を読み書きする前に毎回クラスを初期化する必要はありません。

クラスを「Values」と呼び、次のコードを使用して設計します。

@interface Values : NSObject {
    IBOutlet NSString *strName;
}
@property (nonatomic, copy) NSString *strName;
@end

「Values.h」を別のクラスにインポートし、を使用してプロパティを呼び出します


Values.strName = @"Name";

データが上書きされないように、「値」のオブジェクトを作成しません。'前の構文エラーというエラーがポップアップ表示されます。トークン'。グローバル変数を格納するクラスを作成する他の方法はありますが、これらのデータを使用するときに初期化する必要はありませんか?

4

3 に答える 3

4

この問題に対する別の解決策は、変数 (またはクラス) を AppDelegate オブジェクトに追加することです。AppDelegate が毛羽立ちになるのは簡単ですが、これらの変数が実際にアプリのプロパティである場合は、適切な場所になります。

いつでも AppDelegate への参照を取得できます[UIApplication sharedApplication].delegate(これをキャストする必要がある場合があります)。

于 2009-03-11T07:42:15.030 に答える
3

strName、strNo、intPassword などの多くの値を保持するための特別なクラスを作成したい...

なんで?不変オブジェクトやプリミティブ オブジェクトを読み取り専用のグローバル変数に入れることには何の問題もありません。

NSString *const strName = @"Name";
const NSInteger intPassword = 0xDEADBEEF;

グローバルとしてプレフィックスを付けたい場合は、「g」(gStrNameなど) が一般的であり、正常に機能します。

「でもグローバルは悪だ!」と言いたくなるかもしれませんが、自分の言っていることを考えてみてください: なぜグローバルは悪なのでしょうか?

  • 他のコードがオブジェクトを変更する可能性があるためです。(不変オブジェクトではそうではありません。)
  • 他のコードでオブジェクトを置き換えることができるためです。(読み取り専用 ( const) 変数ではそうではありません。)
  • 2 つのコードが同じオブジェクトを使用できるためです。(オブジェクトが文字列や整数などの基本的なものである場合は問題ありません。)

これらの苦情のいずれにも当てはまらない限り、グローバル変数に問題はありません。これらは Cocoa では非常に一般的です (たとえば、文字列定数のほとんどは実際にはグローバル変数です)。

于 2009-03-11T05:19:21.207 に答える
2

シングルトンパターンを使用すると、これに近いものを実現できます。MattGallagherによる「SynthesizeSingleton.h」ヘルパーの使用:

// Values.h
#import "SynthesizeSingleton.h"

@interface Values : NSObject {
  ...
}

// props

+ (Values *)sharedValues;
@end

// Values.m
@implementation Values

SYNTHESIZE_SINGLETON(Values);

@synthesize props;

@end

次に、シングルトンを使用するには:

NSString *myVal = [[Values sharedValues] someValue];

また:

Values *v = [Values sharedValues];

NSString *myVal = v.someValue;

于 2009-03-11T04:07:50.443 に答える