iOS3コードをiOS5に移植する途中です。もともと私はグローバルデータストアにシングルトンを使用していました。私はView Controllerを介してアクセスするために必要なすべてのデータのインスタンスを1つ提供していましたが、主にサーバーから取得したデータが格納されていました。iOS3コードをiOS5に移植する:シングルトンの問題
iOS3バージョンでは、私のデータストアにMatt Gallagherのsingleton implementationを使用しました。しかし、iOS5ではARCを使いたいので、Luke RedpathのGCD implementationに移動しました。
今、サーバーデータを取得するコードに問題があります。シングルトンのinit関数では、私のサーバーをポーリングしてシングルトンを生成しようとします。サーバー通信は別のクラスで処理されます。コミュニケーションクラスは、シングルトンに格納されている資格情報データを使用します。これは私が問題に陥っているようです。コードを実行すると、シングルトンにアクセスするコード行が表示されたときに、サーバーのCOMルーチンが終了します。エラーも警告もなく、シングルトンアクセスラインに当たったときにルーチンが終了します。
シングルトンは他の場所でも正しく動作しているので、これはシングルトンへの循環参照(シングルトンにアクセスしようとするサーバークラスをインスタンス化する)と関係があると想定しています。
この時点で、どのように進めるのか分かりません。私はむしろポートのために自分のコードを再構成しないだろう。 a)私の問題は何か、そしてb)サーバーデータの単一の、グローバルにアクセス可能なインスタンスを作成するための他の選択肢に関する提案? sosbornにより示唆されるように、Appleのsingleton design patternを使用して
編集
は、私のシングルトンの初期化ルーチンで次のコードブロックに問題が発生します。最後の行で
// enable the location controller
locationController = [[LocationController alloc] init];
locationController.delegate = self;
[locationController.locationManager startUpdatingLocation];
私は、これは、メモリ管理の問題であると仮定し
warning: Unable to restore previously selected frame.
とEXC_BAD_ACCESS
を取得します。 Appleのドキュメントに基づいて、私はメモリ管理ルーチンをオーバーライドしませんでした。
If you want a singleton instance (created and controlled by the class factory method) but also have the ability to create other instances as needed through allocation and initialization, do not override allocWithZone: and the other methods following it as shown in Listing 2-15.
私はこれは間違ってませんでしたか?
私はこれもやろうとしましたが、私の実装は少し異なりました。このソリューションは、シミュレータで実行するとコンピュータがフリーズする原因となりました。メモリ管理ルーチンを書くことを無視したのは、私が間違っていたところです。 –
リンゴの人々でさえ、 "公式の"シングルトンの実装は好きではありません:http://stackoverflow.com/a/5720476/852828 – jrturton
彼らはそれを好きではないかもしれませんが、それは動作しないことを意味しません。あなたの実装を正確に実行し、動作するかどうかを確認してください。 – sosborn