1

アプリデリゲートを利用するクラスがあります。具体的には、クラスから更新されているNSUserDefaultsプロパティがあります。

私の認証クラス実装ファイルには、次のものがあります。

+ (BOOL) checkUserDefaults {
    AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];

    if([appDelegate.session objectForKey:@"UserID"] != nil) {
        return TRUE;
    } else {
        return FALSE;
    }
}

+ (void) syncUserDefaults : (NSString *) UserID {
    AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
    [appDelegate.session setObject:UserID forKey:@"UserID"];
    [appDelegate.session synchronize];
}

このコード行をどのように保存しますか?

AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];

グローバルとして(このクラスに対して)、たとえば[app.session setObject ...]と書くことができますか?

私は関数を作ることができました:

+ (AppDelegate *) app
{
    return (AppDelegate *) [[UIApplication sharedApplication] delegate];
}

そして、そうします[[self app].session setObject...]が、「app」関数を何度も参照しているとしたら、AppDelegateを何度もインスタンス化することになりますね。

4

3 に答える 3

3

これがまさにシングルトンデザインパターンの目的であり、Cocoaフレームワークの開発者が、アプリ全体でオブジェクトにアクセスする可能性がある場所でシングルトンフレームワークを使用する理由ですが、インスタンス化する必要があるのは1回だけです。

+[UIApplication sharedApplication]クラスの既存のインスタンスを返すメソッドです。UIApplicationセレクターで「共有」という単語を使用することは良いヒントであり、ドキュメントにUIApplicationはそれがシングルトンであることが明確に記載されています。

sharedApplication

シングルトンアプリケーションインスタンスを返します。

+ (UIApplication *)sharedApplication

これはすべて、 n回呼び出すときにn個のオブジェクトをインスタンス化していないので安心できることを意味します。

于 2012-08-05T19:51:13.847 に答える
1

アプリデリゲートへの参照を取得し、それを特定のクラスにキャストしています。このコードでアプリデリゲートをインスタンス化していないため、メモリの問題はありません。

于 2012-08-05T19:46:18.310 に答える
0

いいえ、appメソッドはオブジェクトを作成しません。グローバルオブジェクトを見つけて、そのプロパティへのポインタを返すだけです。

于 2012-08-05T19:46:56.627 に答える