1

NSDateFormatterオブジェクト(特定の目的のためにカスタマイズされたもの)を複数回使用しています。私はobjcの専門家ではないので、それに対処するための3つの異なるアプローチを考え出しました。

最初のものでは、NSDateFormatterカテゴリを作成し、そこでコードをカスタマイズしました。これは一般的なアプローチですが、そのようなオブジェクトを作成するたびに、これはメインの自動解放プールに配置されます。この動作は、非ARCコードとARCコードの両方に有効だと思います。

代わりに、2番目の方法では、メソッドをオーバーライドして、+(void)initializeそこにカスタマイズコードを配置しました。ここに簡単な例があります:

static NSDateFormatter* dateFormatter = nil;

+(void)initialize
{
    dateFormatter = [[NSDateFormatter alloc] init];
    // other code here
}

最後に、次のようなプロパティを介した遅延読み込みのインスタンス化を使用して、3番目のアプローチを設定しました。

-(NSDateFormatter)dateFormatter
{
    if(dateFormatter) return dateFormatter;        
    // alloc-init here
}

そうは言っても、オブジェクトを複数回処理するのにどのアプローチが最適で+(void)initialize、そのように使用するのが正しいかを知りたいと思います。

前もって感謝します。

4

2 に答える 2

4

後者の方法はどちらも正しいですが、それらをまとめたいと思います!

static NSDateFormatter *sharedInstance = nil;

+ (NSDateFormatter *)sharedInstance {
    if (sharedInstance == nil) {
        sharedInstance = [[NSDateFormatter alloc] init];
    }
    return sharedInstance;
}

注: このようなクラスはシングルトンと呼ばれます。続きを読む

于 2012-05-09T11:42:22.413 に答える
2

基本的に、私のお気に入りのパターンは、mindw0rkがすでに与えているパターンです(私は彼の答えに賛成票を投じました)。メソッドをのカテゴリに入れることができるという利点がありますNSDateFormatter。私はそれを少し修正します:

+ (NSDateFormatter *)sharedInstance {
    static NSDateFormatter *sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[NSDateFormatter alloc] init];
    }
    return sharedInstance;
}

そのため、最初に初期化せずに誤って参照することはできませんsharedInstance

複数の共有インスタンスがある場合は、それぞれを取得するための異なるメソッドを使用できます。

+ (NSDateFormatter *)dateFormatterForFoo {
    static NSDateFormatter *sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[NSDateFormatter alloc] init];
    }
    return sharedInstance;
}

+ (NSDateFormatter *)dateFormatterForBar {
    static NSDateFormatter *sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[NSDateFormatter alloc] init];
    }
    return sharedInstance;
}

または、カスタマイズされた各日付フォーマッタに独自のサブクラスがある場合は、それぞれを実装+sharedInstanceして、適切なクラスのオブジェクトを返すことができます。

または、日付フォーマッターの辞書を作成することもできます。

+ (NSDateFormatter *)customisedFormatterForKey: (NSString*) key {
    static NSDictionary *sharedInstances = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[NSDictionary alloc] initWithObjectsAndKeys: ....];
    }
    return [sharedInstance objectForKey: key];
}

-initializeこのアプローチについてコメントがあります。

の使用には少し注意する必要があります-initialize。クラスを最初に使用する直前に1回呼び出されます。クラスを使用したことがない場合、クラスが呼び出されることはありません。したがって、コードを機能させるには、共有インスタンスの使用を開始する前にNSDateFormatter、のインスタンスまたはにメッセージを送信する必要があります。dateFormatter自体にメッセージを送信することはカウントされないことに注意してください。これは、最初からクラスがないためです。NSDateFormatter dateFormatternil

于 2012-05-09T13:49:16.370 に答える