1

プロジェクト全体で一度だけ割り当てオブジェクトであるシングルトンクラスがあります。以下にいくつかのコード行を示します。

宣言... ....

MyClassName *classObject = nil

init メソッドでは、コードは次のようになります。

-(id) init(){
    self = [super init];

    if(classObject == nil){

        1. Allocate object code here
        2. classObject = self;
        3. return classObject
     } else {
        return classObject;
     }
}

しかし、私の問題は、このオブジェクトの割り当てをどのように解除するかということです。私はすべてのクラスからこの init メソッドを呼び出しており、毎回 classObject 参照を返しています。

私のアプローチ....

appdelegate.m の dealloc メソッドから、 MyClassName で定義されている関数 (releaseObject) を呼び出しています。これが関数本体の定義です...

 -(void) releaseObject {

    [self release]; // Confusion: Will it dealloc classObject reference?
    [super release];

}

これは良いアイデアで、このオブジェクトの割り当てを解除しますか? 私の問題は、アプリケーションが閉じられるまでオブジェクトの割り当てを解除する必要がないことです。

4

4 に答える 4

3

答えは、シングルトンをリリースする必要はありません。とにかく、アプリケーションの存続期間が続くはずであり、プロセスが終了すると、他のすべてと一緒に自動的に消えます。同じ理由で、アプリ デリゲートの dealloc メソッドが呼び出されないことがあります。

アプリケーションを閉じるときにクリーンアップを行う必要がある場合は、それを別のメソッドに移動し、アプリケーションが終了しようとしているときにそれを呼び出す方がよいでしょう。


シングルトン IMO のより単純なパターンは、クラス メソッドを使用してシングルトン インスタンスを返し、init 内のものを解放することをいじらないことです。

+(MyClass*) sharedInstance
{
    static MyClass* theInstance = nil;
    static dispatch_once_t pred;
    dispatch_once(&pred, ^{ theInstance = [[MyClass alloc] init]});
    return theInstance;
}

上記はdispatch_once、初期化ブロックがアプリケーションの存続期間中に 1 回だけ発生するようにするために使用されます。直接呼び出して他のインスタンスを作成することもできますinitが、それは有利な IMO です。

于 2012-05-21T08:26:50.273 に答える
1

シングルトンに追加のクラス メソッドを作成することをお勧めします。

static MyClassName *classObject = nil;
...
+ (MyClassName *)sharedInstance {
...
}

+ (void)releaseSharedInstance {
  [classObject release];
  classObject = nil;
}
于 2012-05-21T09:10:40.503 に答える
0

Objective C++ による回避策は次のとおりです。

class StaticOwner {
private:
    id<NSObject> object;
public: 
    StaticOwner(id<NSObject> obj) { object = [obj retain];  }
    ~StaticOwner() { [object release]; }
    id<NSObject> instance() {return object;}
};

使用例:

+ (MySingleton*) sharedInstance {
    static StaticOwner owner = StaticOwner([[[MySingleton alloc] init] autorelease]);
    return owner.instance();
}
于 2012-05-21T09:43:28.590 に答える
0

クラスがシングルトンの場合、AppDelegete で dealloc を呼び出すだけです

[[YourClass instance] release];
于 2012-05-21T08:05:23.310 に答える