AppDelegate を他のクラスで使う

AppDelegate とは何だろう。delegate とどう違うのか。

私も未だ明快にわかっていないのですが、AppDelegate は、Application 全体を通じて共有するようなオブジェクトを定義しておいて、必要に応じて参照・更新するような使い方をするようです。言ってみれば、昔のグローバル変数にすごく似ているのかなと。

AppDelegate の場合、Application を通じて参照できるため、AppDelegate というクラスをわざわざ定義してインスタンス化したオブジェクト参照するという手の込んだ概念となっていますが、グローバル変数だと考えた方が遠回りでもないし、理解が早い。

オブジェクト指向では忌み嫌われるグローバル変数の概念ですが、例えばゲームのスコアのような全体を通じて参照・更新するような性質のものの扱いには、確かに便利な概念でしょう。

目下、CoreDate を使っていて、アプリケーションの随所で参照するマスターデータがある場合、AppDelegate で managedObjectContext を生成しておいて、他のクラスで必要に応じて参照・更新できると、多分、メモリの節約にもなるし code も少なくて済むでしょう。

そんな訳で AppDelegate を使おうとすると、素ではすごくめんどくさい。

NSManagedObjectContext* mg = [(AppDelegate *)[[UIApplication sharedApplication]delegate];

とした上で、

NSEntityDescription* entity = [NSEntityDescription entityForName:@"someEntity"

                                              inManagedObjectContext:mg];

などとする。

何がめんどくさいかというと、初めの (AppDelegate*)[UIApplication... の部分で、キャストですか?、使うたびに毎回ですか?、何ですかそれ? みたいな感じになる訳です。

なので、例えば、viewDidLoad メソッド辺りに、

appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];

としておくと、以降は、appDelegate.hogehoge のように、いつもの property のように使用できて便利だなと。

もちろん、クラスの頭で

Appdelegate* appDelegate;

と宣言することも忘れてはならない。