グローバル状態を使用するのではなく、View Controller間で依存関係を渡す(注入する)ことの利点がわかります。しかし、私は人々が実際にこれをどのように実装するのか興味があります。
最も単純なケースでは、2つのViewController間で単一のモデルを渡すのは簡単です。
MyViewController *vc = [[MyViewController alloc] init];
vc.model = model;
[self.navigationController pushViewController:vc animated:YES];
ただし、このアプローチのスケーリングには2つの問題があります。
1)すべてのView Controller(ロケーションマネージャ、オブジェクトストアなど)に必要なサービスがいくつかある場合があります。したがって、ViewControllerごとに設定する必要のある依存関係のリストができあがります。
MyViewController *vc = [[MyViewController alloc] init];
vc.model = model;
vc.locationManager = locationManager;
vc.objectStore = objectStore;
...
[self.navigationController pushViewController:vc animated:YES];
2)2番目の問題は、最初の問題に関連しています。ViewControllerをプッシュする前に、これらの依存関係を設定することを実際に強制しているわけではありません。すべての依存関係を必要とするinitメソッドを作成できると思いますが、それでも強制することはできません。また、時間がかかり、後で依存関係を追加したい場合は、非常に苦痛になります。
これらの問題を処理するために使用されているアプローチは何ですか?多くのObj-Cの人々が依存性注入フレームワークを使用しているようには見えません。私が考えることができる1つの方法は、すべての共有依存関係を含むAppContextクラスを作成し、それをすべてのViewControllerに渡すことです。
また、一般に、(少なくともJavaでは)依存関係を実装ではなくインターフェースで宣言するので、単体テストのためにそれらをモックすることができます。このようにプロトコルを使用しているObj-Cの人々はあまり見かけません。次に、単体テストの依存関係をどのようにモックしますか?