0

私がBasicEngineクラスを持っているとしましょう:

@interface BasicEngine : GfxEngine{

    NSMutableDictionary *keyNodes;
    AbstractVirtualJoystick *input0;
}

関連する実装は次のとおりです。

@implementation BasicEngine
- (id)init {

    if ( (self = [super init]) ) {

        keyNodes = [NSMutableDictionary dictionary];
    }
    return self;
}

私の理解では、呼び出し[ dictionary]は自動解放されたオブジェクトを返します。BasicEngineただし、このディクショナリは、インスタンスが使用可能である限りメモリに保持する必要があります。

keyNodesすぐに物になると、何かが足りないことに気づきnilます。メソッドで使用[keyNodes retain]するinitことは役に立ちますが、クラスメンバーを保持する必要がある理由がわかりません。

私がこれを理解するのを手伝ってください:-)ありがとう。

4

2 に答える 2

2

retain被保持者の保持者の所有権を意味します。はクラスメンバーであるためkeyNodes、エンジンはそれを「所有」し、したがってそのretain上にある必要があります。

内部でretainは、の参照カウントをインクリメントしています。これは、システムに、もう1つのオブジェクトがメモリ内のポイントをkeyNodes保持することに関心があることを通知します。同様に、メソッドでkeyNodes呼び出すことが期待されます。これにより、エンジンが「所有」しなくなるため、保持カウントがデクリメントされます。releasekeyNodesdeallockeyNodes

于 2012-05-27T12:24:20.860 に答える
0

keyNodes使用可能になるまでオブジェクトを維持したい場合はBasicEngine、シングルトンパターンで実装して静的にすることもできます。

参照:http://xperienced.com.pl/blog/3-ways-to-implement-singleton-pattern-in-objective-c

于 2012-05-27T12:29:38.970 に答える