1

Xcode4.3.2とiOSシミュレーターを使用してiPadアプリケーションを作成しています。起動時にシングルトンに登録したい一連のクラスがあり、他のクラスがこれらの登録済みクラスによって提供されるそのシングルトンを介してサービスを要求できるようにします。

この動作を実現するために、NSObjectのloadクラスメソッドをオーバーライドすることに依存してきました。ただし、自動解放プールを設定する機会がなくなる前に、 loadメソッドによって実行されるすべてのコードがmain関数の外部で発生することを発見しました。現在、アプリケーションでサードパーティのテクノロジーを使用しており、使用や自動参照カウントが禁止されているため、作成されたオブジェクトの存続期間を管理するために自動解放プールに依存する必要があります。

登録プロセス中に、シミュレーターのデバッグコンソールに、自動解放プールなしで自動解放が呼び出されたことを訴えるメッセージがいくつか表示されます。これらの1つは、シングルトンによって割り当てられた辞書に関連しています。その他は、スタックからコピーされ、そのシングルトンディクショナリに格納されるブロックオブジェクトに関連しています。

これらのデバッグメッセージがどれほど深刻かは私にはわかりません。シングルトンはアプリケーションの存続期間中存在する必要があり、その辞書はリリースされない可能性が高いため、辞書の割り当てに問題はないのではないかと思います。同様に、ディクショナリに格納されているブロックも保持されるはずなので、copyメソッドを呼び出した後、わざわざautoreleaseを呼び出す必要はないのでしょうか。

あるいは、問題が少ないかもしれない現在の技術に頼ることなく、私が望むことを達成する別の方法があるかもしれません

人々はこの問題について何を提案できますか?

4

2 に答える 2

2

クラスが含まれているイメージがロードされたときではなく、クラスが最初に参照されたときに,が呼び出される+[NSObject initialize]よりも、オーバーライドする方がうまくいくはずです。これにより、これらすべてをより適切に処理できます。loadinitialize

于 2012-04-29T01:28:36.183 に答える
1

良いアプローチはdispatch_once_t、すべてのスレッドで、ランタイムごとに 1 回だけ実行される を使用することです。

+ (id)sharedInstance
{
    static dispatch_once_t once;
    static SingletonClass *sharedInstance;
    dispatch_once(&once, ^ { sharedInstance = [[self alloc] init]; });
    return sharedInstance;
}
于 2012-04-29T01:32:56.417 に答える