cocoaでのSingletons、Global values
私は最近iPhone用アプリ開発に励んでいますが、開発中によく直面する課題の一つは
各Controllerで共通に使う変数をどうやって実装するかということです。
今まではAppDelegateから各controllerの生成時に変数を渡す形にしていましたが、
必要な変数が増えるとその度入れないと行けないので冗長なパターンですね。
で、今回開発中に見つけたのがこれ
http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
いつも有難いcocoa with loveさんのブログですが
ここに良い方法がありました。
どんなApplicationでもAppDelegateは一つだけなので
そのAppDelegateを呼ぶことが出来ればまるでsingleton見たいに
利用することも出来ます。
AppDelegateを取得する方法は
cocoa
[NSApp delegate]
iPhone SDK [UIApplication sharedApplication].delegate
です。
例えば
iPhoneのUI ControllerにmanagedObjectContextを入れたい場合
下記のようにAppDelegateから直接入れるしかないため
AppDelegate.m UINavigationController *navController = [[tabBarController viewControllers] objectAtIndex:1]; [secondController setManagedObjectContext:self.managedObjectContext];
UIViewControllerが増える度にその作業をしないといけなくなります。
でもController側からAppDelegateの変数をゲットすることが出来たら
SecondViewController.m self.managedObjectContext = [(AppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];
上記のように自分が必要な時にObjectを取得する事も可能になります。
Singletonというのは便利な割には危ない所もありObject間の結合性を
高めることがありますが上手に使ったらシンプルなデザインにもなる両端の刃です。
cocoa with loveのブログにも書いてある通り、singletonはなるべく使わない方が良いものです。
使うときは本当に必要な所だけ限定的に使って下さい。