コンパイラマクロの代わりに(これは時々驚きを引き起こす可能性があります)、私は通常、次のようにアプリデリゲートでクラスメソッドを定義します。
+ (AppDelegate *)sharedDelegate
{
return [[UIApplication sharedApplication] delegate];
}
次に、グローバル状態への参照が必要な場合は、次のように呼び出すことができます。
[[[AppDelegate sharedDelegate] managedObjectContext] deleteObject:foo];
アプリが十分に複雑な場合は、グローバルコンテキストを使用するのではなく、管理対象オブジェクトコンテキストへの参照を渡すのに苦労する価値があるかもしれません。そうすると、変更をグループ化するための子コンテキストなど、後でリファクタリングして他の手法を使用することが容易になります。
具体的には、各ビューコントローラが独自のmanagedObjectContextインスタンス変数を持っていることを意味します。新しいViewControllerを提示するときは、参照を渡します。おそらく、カスタムinitメソッドで、おそらくプロパティを設定することによって。どのクラス(ルートビューコントローラーを除く)も、グローバルアプリデリゲートを参照しません。このように、複雑な編集ビューがある場合は、変更を「一時的に」保存できる子コンテキストを指定できます(すべてのオブジェクトが有効であることを確認するため)。ユーザーがキャンセルボタンを押すと、コンテキスト全体が破棄されます。
また、常にグローバルコンテキストを使用している場合は、追跡が難しいバグがある可能性があります。たとえば、編集ビュー自体がクリーンアップされない場合、無効なオブジェクトが残ります。次に、無関係なものを保存しようとすると、エラーが発生します。私に起こった、デバッグするのは面白くありませんでした。