2

親切にしてください..私はこのようなものの初心者です。何度も呼び出すメソッドを介してオブジェクトを割り当てて使用したいのですが、オブジェクトをグローバル変数にしてinitWithFrameメソッドに割り当てるのではなく、1つのメソッドだけに割り当てて、ローカル変数にします。次に割り当てて使用します。

4

4 に答える 4

6

一歩下がって、そのオブジェクトにアクセスするためにいくつの異なるものが必要かを考える必要があります。

全員の場合は、共有インスタンス パターンを実装する必要があります。何かのようなもの:

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

上記は、初期化時のスレッド化を考慮していないことに注意してください。つまり、複数のスレッドが初めてメソッドを同時に呼び出すと、複数のインスタンスが発生する可能性があります。+allocまた、との分割は-init、この状況に固有のパターンであることに注意してください。そうすることで、-initメソッド+ mySharedObjectThatEveryoneUsesが呼び出され、割り当てが発生する前に 2 番目のインスタンスが作成される状況を回避できます。

さて、オブジェクト グラフ内のアクセスについて話している場合は、次のようになります。アプリケーション内のオブジェクトのサブセット内の単一のインスタンスにアクセスするには、すべてのオブジェクトがアクセスできる場所にインスタンス変数が必要です。

たとえば、Player オブジェクトがあり、その Player オブジェクトに一連の Piece インスタンスがあるゲームを実装しているとします。ピースが作成されると、通常、所有しているプレーヤーを参照するプロパティがあり、それが単一の参照ポイントになります。

より一時的なものが必要な場合は、コントローラー層が何であるかを確認する必要があります。つまり、その単一のインスタンスにアクセスする必要がある一連のオブジェクトのコーディネーターとして機能できるオブジェクトがどこかにある必要があります。

于 2010-01-17T00:47:00.550 に答える
1

必要なものはシングルトンと呼ばれます。ここでシングルトンを作成するためのAppleの推奨方法を読むことができます:

http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

「Cocoa オブジェクト」セクションで「シングルトン インスタンスの作成」を探します。クラス レベルの初期化子だけでなく、定義するのに適したメソッドがいくつかあります。

于 2010-01-17T06:54:16.630 に答える
1

static私があなたの質問を正しく理解していれば、あなたは変数を探しています。静的変数は、グローバル変数のように値を保持しますが、ローカル変数のように関数の "内部" に存在します。関数は次のようになります。

+ (MyObject *)getSingletonObject {
   static MyObject *obj = [[MyObject alloc] init];
   return obj;
}

objこのメソッドを最初に呼び出したときに作成されますが、メソッドを再度呼び出すと、既に作成されたものと同じオブジェクトが返されます。

于 2010-01-16T23:57:09.193 に答える
0

あなたの質問を完全に理解できるかどうかはわかりませんが、同じオブジェクトを何度も割り当てることはできません。

新しいインスタンスが必要になるたびに、Classオブジェクトに新しいインスタンスを割り当てるように要求します(そうです、オブジェクト自体であるクラスは驚くべきものです)。したがって、このコード:

NSString* s;
s = [[NSString alloc] init];
s = [[NSString alloc] init];

ここでは、NSStringの2つのインスタンスを作成しています。最初のインスタンスを割り当ててリリースしておらず、その唯一の参照を新しいインスタンスに割り当てているため、このコードは不適切です。これにより、メモリリークが発生します。

于 2010-01-16T23:15:50.553 に答える