さて、質問が賛成票を投じられ、誰が知っているのかという理由でゼロに反対票を投じた後、私は自分の答えを調査し続けました。アプリの委譲クラスを真のシングルトンにして、NIB で頭痛の種にならないようにすると便利だと思います。 なぜ有害なのか理解できません。 また、アプリに単一のユーザー インターフェイスがある場合、すべての NIB のコア データ スタックをアプリのデリゲートに所有させることは不合理ではないと思います。ただし、推奨される設計パターンは、各ウィンドウまたはビュー コントローラーに ManagedObjectContext ポインターを渡し、App Delegate オブジェクトを使用するのではなく、ファイルの所有者プレースホルダーを介して MOC にアクセスすることです。
しかし一方で、すべての NIB で特別なオブジェクトを取得する「Shared User Defaults Controller」シングルトンでは状況が異なります。すべてのビューがアクセスできるように、すべてのコントローラーにポインターを渡す必要はありません。それは遍在しています。アプリのデリゲートは異なります。すべての NIB に「Shared App Delegate」オブジェクトはありません。はい、NIB でアプリ デリゲートと対話しない理由がありますが、それは質問に対する答えではありません。
では、回答です。
シングルトンの設計パターン:この非推奨のリファレンス ドキュメント -- シングルトン インスタンスの作成
で、Apple がずっと前に取り上げました。
アプリケーションデリゲートクラスに実装したいのは、アプリデリゲートクラスの他のオブジェクトを作成できるファクトリメソッドではなく、「厳密な」実装であることがわかりました。ここでの 1 つの異なる機能は[NSApp delegate]
、アプリ デリゲート クラス関数ではなく、マスター ポインターであることです。
厳密な実装では、アプリケーション デリゲート クラスの allocWithZone をオーバーライドする必要があります (alloc が allocWithZone を呼び出すため)。
+ (MYAppDelegate*)allocWithZone:(NSZone *)zone
{
if ([NSApp delegate] == nil) return [super allocWithZone:zone];
return [NSApp delegate];
}
- (MYAppDelegate*)copyWithZone:(NSZone *)zone
{
return self;
}
Init が返さ[super init]
れるだけで問題ないため、オーバーライドは必要ありません。
うまくいくようです。そうでない場合は、これを更新します。
[更新] を使用した NIBNSBundle
の読み込みについても調査loadNibNamed:owner:topLevelObjects:
していますが、そのメソッドからでも、新しいアプリ デリゲート オブジェクトを使用して配列が返されるようです。このメソッドを使用すると、NIB 内のトップレベル オブジェクトへのポインターを取得できます。他の方法でアウトレットを作成する必要はありません。MainMenu 以外の XIB でアプリ デリゲート オブジェクトを取得する最良の方法は、上記のコードのようなものを使用することです。
[別の更新]有害である可能性がある理由:このドキュメントの「OS X のトップレベル オブジェクトには特別な処理が必要な場合がある」セクションによると、ARC を使用しても、私のこの回答が増加すると信じる十分な理由があります。 [NSAppデリゲート]の保持カウントですが、アプリデリゲートのトップレベルオブジェクトを持つウィンドウ/ビューコントローラーのdeallocでアプリデリゲートのブリッジとリリースを行っても問題ないかどうかを確認してください。さらに、アプリ デリゲート クラスの外側のコードを意味します。