2012-03-08 11 views
0

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.

私はこれは間違ってませんでしたか?

答えて

0

この問題を完全に解決することはできませんでした。最終的には、新しいブロックベースのHTTPリクエストメソッドを使用してアプリをリファクタリングすることに決めました。

0

なぜアップルのrecommended code for singletonsを使用しないのですか?

+0

私はこれもやろうとしましたが、私の実装は少し異なりました。このソリューションは、シミュレータで実行するとコンピュータがフリーズする原因となりました。メモリ管理ルーチンを書くことを無視したのは、私が間違っていたところです。 –

+0

リンゴの人々でさえ、 "公式の"シングルトンの実装は好きではありません:http://stackoverflow.com/a/5720476/852828 – jrturton

+0

彼らはそれを好きではないかもしれませんが、それは動作しないことを意味しません。あなたの実装を正確に実行し、動作するかどうかを確認してください。 – sosborn

0

確かには、シングルトンクラスのように聞こえるとそのプロパティは、まだあなたがそれらを呼び出すときに行くには、完全に準備ができていません。

あなたはinitメソッドで多くのネットワークのことを言います。あなたはそれを呼び出すときにオブジェクトが完全に準備ができていない状態になることはありますか?あなたが安全にオブジェクトを使用する前に完了するために長いプロセスを持っている場合は

することは、あなたは物事が行く準備ができている次のステップを実行するように通知またはデリゲートパターンを使用した時に見えるかもしれません。プロセスの爆弾が警告なしで、デバッグを支援するためにNSZombiesを使用してみた場合のために

関連する問題