Mac-ISV Macで、Micro-ISV

152月/10

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はなるべく使わない方が良いものです。
使うときは本当に必要な所だけ限定的に使って下さい。

Filed under: MacDev Leave a comment
Comments (0) Trackbacks (0)

No comments yet.


Leave a comment


No trackbacks yet.