iOS プログラミング メモ シングルトンクラスの作成について

iOS には、シングルトンという考え方があるのを知って、どうやって実装するのか、実際に手を動かして見ることにした。

備忘録も兼ねて、整理してみた。

プロジェクト名は、SingletonTest (ベタやなあ)
ファイルの構成は、こんな感じ。

AppData.h / AppData.m が、シングルトンクラス。
下は、AppData.h の中身で、AppDataには、4つの変数を持たせている。

一つのポイントとなるのは、

+ (id)sharedInstance;
とメソッドを宣言して、他のインスタンスから直接呼び出せるようにしておくところ。

こうしておいて、他のインスタンスから、下のようにして呼び出す。
ちなみに、これはViewController.m から呼び出しているところ。

このようにして呼び出すと、AppData.h / AppData.m から生成されたインスタンスが、
 (1)存在していないとき→ 新たに生成する
 (2)既に存在しているとき→ 既に存在しているインスタンスを返す

という処理をしてくれるみたい。


AppData.m の中身は、こんな感じ。

ほとんど呪文で、正直、中身は全然理解できてない。。。。
dispatch_once というのが重要らしいです。「スレッドセーフ」だそうな。
スレッドがいくつも走るようなアプリを作ったことがないので、今ひとつピンとは来ないけど。

ビルドして実行すると、ViewControllerクラスから作られた画面が表示される。

テキストフィールドに文字を記入すると、その内容が(AppDataクラスから作られた)インスタンスの内容に反映される。
UP というボタンを押すと、左の数字が一つ増え、その内容が(AppDataクラスから作られた)インスタンスの内容に反映される。

右下のボタンを押すと、似たようなもう一つの画面が開く。
これは、SecondViewController から作られた画面。

(AppDataクラスから作られた)インスタンスの内容を表示させているので、前の画面で表示されていたものと同じ内容が表示される。
さっきと同様に、
テキストフィールドに文字を記入すると、その内容が(AppDataクラスから作られた)インスタンスの内容に反映され、
UP というボタンを押すと、左の数字が倍になって、その内容が(AppDataクラスから作られた)インスタンスの内容に反映される。

複数のViewController 間で、変数を共有したい場合などに使える機能だね。


今回作成したプロジェクト一式は、下のリンクからダウンロードできるようにしておきましたので、拙いソースですが、DLしてみたい方はどうぞ。
Yahoo!ボックス - 大切な思い出をずっと大事にお預かりします

参考にさせていただいたblog
http://d.hatena.ne.jp/koichirohonda/20120325/1332651629