2012-05-09 3 views
1

私はNSDateFormatterオブジェクトを(複数の目的に合わせてカスタマイズされています)複数回使用しています。私はobjcの専門家ではないので、私はそれに対処するために3つの異なるアプローチを考え出しました。+(void)内のalloc-initオブジェクトを複数回再利用するメソッドを初期化します

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

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

static NSDateFormatter* dateFormatter = nil; 

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

最後に、私は次のようなプロパティを使用して遅延ロードのインスタンスを使用して第三のアプローチを設定します。

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

は、私が何であるかのアプローチ知っていただきたいと思い、これを言っこの方法で+(void)initializeを使用すると、オブジェクトを複数回処理するのに最適です。

ありがとうございます。

+1

私は第2または第3の方法が好きであり、すべてのアプローチが私にとって適切であるようです。 – trojanfoe

+0

@trojanfoe +1。ご意見ありがとうございます。あなたのサポートのために –

答えて

4

どちらの方法も正しいですが、私はあなたがそれらをまとめたいと思っています!

static NSDateFormatter *sharedInstance = nil; 

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

注:このクラスはシングルトンと呼ばれています。 Read more

+0

+ 1第二のものはどうですか?ありがとう。 –

+1

もう1つは、共有インスタンスがやっていることです。どのコードを追加するのか分かりませんが、どちらの方法でも自分の状態を把握しなければなりません。これが怠け者の財産にすることがより効果的な理由です。オブジェクトを初期化する必要があるときはいつでもトラッキングする必要はありません。 – carlossless

2

私のお気に入りのパターンは、mindw0rkがすでに与えているパターンです(私は彼の答えに投票しました)。 NSDateFormatterのカテゴリにメソッドを配置できるという利点があります。私は少しthuslyそれを変更します:

+ (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またはNSDateFormatterにメッセージを送信してから、の前に共有インスタンスdateFormatterを使用する必要があります。 は、dateFormatter自体にメッセージを送信しても、とカウントされないことに注意してください。これは、nilから始まり、したがってクラスを持たないからです。

+0

ご協力いただきありがとうございます。 + 1.非常に便利な答えです。あなたが書いたものに基づいて、NSDateFormatter。*のカテゴリにメソッドを置くことができるという利点があります。カテゴリやアプリケーションの他の部分にコードを挿入することをお勧めしますか?たぶんカテゴリは自己完結型の機能を持つことができますが、間違っていますか? –

+2

@Flex_Addicted:bny mindw0rkを作成したような小さなメソッドは、どこにでも置くことができるという利点があります。それは 'NSDateFormatter'のカテゴリで動作するか、それをあなたが好きなクラスに追加することができます。アプリケーションデリゲート。あなたがすでにそれを(アプリケーションデリゲートのような)シングルトンであるオブジェクトにアドリブするならば、それをインスタンス変数に裏付けられたインスタンスメソッドにするでしょう。 – JeremyP

関連する問題