1

コア データ マネージド オブジェクト コンテキストに頻繁にアクセスする必要があり[[UIApplication sharedApplication] delegate]、すべてのクラスで毎回インスタンスを取得して変数に格納する代わりに、これを実行しても問題ないかどうか疑問に思っていました。

@interface NSObject(DelegateExtension)
- (AppDelegate*)appDelegate;
@end

@implementation 
NSObject(DelegateExtension)
- (AppDelegate*)appDelegate
{
    return (AppDelegate*)[[UIApplication sharedApplication] delegate];
}
@end

self.appDelegateそのため、コードのどこでも実行できます。

夜は明らかかもしれませんが、これを行うことで何か問題がありますか? それは悪いプログラミングの練習ですか?

4

4 に答える 4

5

または、プリプロセッサマクロ(または静的C関数)をPrefix.pchファイルに追加することもできます。

#define AppDelegateInstance() (AppDelegate *)[[UIApplication sharedApplication] delegate]

これにより、コード内のどこからでもアプリデリゲートにアクセスできるようになり、。という名前の既存のメソッドと競合する可能性がなくなりますappDelegate

于 2012-05-01T03:48:42.040 に答える
2

私は通常、グローバル変数を使用してアプリデリゲートをポイントします。

MyAppDelegate.hの場合:

extern MyAppDelegate* AppDelegate;

MyAppDelegate.mの場合:

MyAppDelegate* AppDelegate = nil;

- (id)init {
    if (self = [super init]) {
        AppDelegate = self;
        …
    }
}

これで、「MyAppDelegate.h」をインポートする人は誰でも、AppDelegate変数を使用してアプリデリゲートにアクセスできます。

于 2012-05-01T04:15:12.537 に答える
2

NSObjectUIApplicationまたはそのデリゲートへの意味のある接続はありません。設計の観点から、これを行うことは悪い意味でハックになると思います。頭のてっぺんから思いつくことができる他の3つのソリューションがあり、それらは何百万倍も優れていると思います。

  1. 宣言がプレフィックスヘッダーによってインポートされるヘッダーにある関数。

  2. カテゴリ on UIApplication。実際には、実行しようとしているアクションと関係のあるクラスです。

  3. OS X*のようなグローバル・ポインターはNSApp、インスタンスを指すようにプログラムで最初に設定されUIApplicationます。

  4. (4 つのソリューション!) アプリ デリゲートへのグローバル ポインター。

3 または 4 の実装に関する情報については、遅延インスタンス化と簡易メソッドについてを参照してください。


*なぜ彼らがiOSでこれをしなかったのか本当に理解できません.

于 2012-05-01T04:08:48.277 に答える
0

もちろん、Apple が近い将来 appDelegate という名前のメソッドを持っていない、または持っていないことを知っている限り、それは安全です。特に NSObject がルート クラスであるため、サブクラス化が推奨される方法です。しかし、それにはクラスのポージングが必要であり、OSX 10.5 以降では完全に廃止され、iOS デバイスでは実行可能なオプションでさえありません。

于 2012-05-01T03:40:31.417 に答える