2

私はぐるぐる回って自分自身を走り回りましたNSMainNibFile.. 2 つのアプリ デリゲートが動き回っているということは、別々の があることを意味しますmanagedObjectContexts

ここに考えがあります-アプリケーションデリゲートクラスをシングルトンにできますか? そして、より多くの XIB で安全にインスタンス化しますか? それは何を壊しますか?

[[UIApplication sharedApplication] delegate]また、 「シングルトン」であるスタックオーバーフローに関するいくつかの言及がありますが、UIApplicationDelegateプロトコルがそれを保証しているようには見えず、スーパークラスUIResponderもシングルトンではありません。それで、iOSでもこの点で自分自身を撃つことができますか?

UIApplicationMain[編集] iOSの delegateClassName を nil アウトして、メイン NIB にデリゲート オブジェクトをロードさせることができるように見えます。そのため、メイン NIB を使用している場合、OSX で見られる App Delegate オブジェクト パターンを作成できます。

[edit2] 新しい非ドキュメント アプリケーションの MainMenu.xib がどのように見えるかのスクリーンショット。プロジェクトはこのオブジェクトで作成され、アプリ デリゲート クラスはウィンドウ プロパティで作成されます。問題は、他のNIBで便利なオブジェクトを取得することであり、そのオブジェクトは[NSApp delegate] ここに画像の説明を入力

4

3 に答える 3

0

さて、質問が賛成票を投じられ、誰が知っているのかという理由でゼロに反対票を投じた後、私は自分の答えを調査し続けました。アプリの委譲クラスを真のシングルトンにして、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でアプリデリゲートのブリッジとリリースを行っても問題ないかどうかを確認してください。さらに、アプリ デリゲート クラスの外側のコードを意味します。

于 2014-04-04T21:44:29.460 に答える
0

いずれにせよ、コア データを処理するためにアプリ デリゲートを使用するべきではありません。したがって、強制的なシングルトンにすることは無意味です。

理想的には、それを参照する必要はまったくありません。

于 2014-04-04T22:59:24.053 に答える