2011-06-20 9 views
9

私のチームは、コードベース全体でさまざまなNSDateFormatterオブジェクトを使用していたことを発見し、複数の別々の場所で共通のフォーマッタを割り当てる/初期化するコスト/混乱を避ける方法を探し始めました。共有NSDateFormatter - ベストプラクティス?

一般的に設定されたフォーマッタの静的インスタンスへの参照を提供するNSDateFormatterクラスのカテゴリを作成することを考えました。例えば、我々はいくつかの場所で「短時間」日付フォーマッタを使用していた、そして次のクラスメソッドを追加するために探していた:私はこのアプローチを持っている問題の

@implementation NSDateFormatter (NSDateFormatter_PDDateFormatters) 

static NSDateFormatter * shortTimeFormatter = nil; 

+ (NSDateFormatter *) PDSharedShortTimeFormatter { 

    @synchronized([NSDateFormatter class]){ 

     if(shortTimeFormatter == nil){ 

      // Create new formatter for SHORT times (e.g. 12:00 pm) 

      shortTimeFormatter = [[NSDateFormatter alloc] init]; 
      [shortTimeFormatter setDateStyle: NSDateFormatterNoStyle]; 
      [shortTimeFormatter setTimeStyle:NSDateFormatterShortStyle]; 
     } 

     return shortTimeFormatter; 

    } 

    return nil; 
} 

@end 

一つは、「我々は現在はないということですNSDateFormatterが変更されないよう保護します。フォーマッタは本質的にアプリケーション全体で「共有」されているため、別のオブジェクトがフォーマッタの設定(たとえば、時刻/日付スタイル)を変更すると問題が発生する可能性があります。

私たちはこれを内部的に使用しているため、私たちのチームがこの機能を悪用するリスクはあまりありません(小規模なチームであり、明確にコメントされています)。

しかし、私はここでベストプラクティスについて疑問を抱いていました。

不変の参照を日付フォーマッタに返す方法はありますか?私がフォーマッタのコピーを返すのであれば、私たちが今行っているalloc/initsを行うよりも安いでしょうか?

ここでは他の方法もありますか?

私たちはこれを実行していますが、「良い」コードを書いてフィードバックを得るのは常に良いことです。

答えて

9

通常、あなたはそれについて心配しないでください。 Obj-Cは、ほとんどあらゆるもののジューシーな内部をバイディングすることができます。 @privateでも-valueForKey:_thatFunPrivateIvarから保護されません。他のすべてが失敗した場合は、ランタイム関数を呼び出すことができます。

ただし、ここで最も簡単な回避策は、内部的にキャッシュされたフォーマッタを使用するAPIを公開することですが、使用しているフォーマッタにはアクセスできません。あなたのコードでは、+[Formatter shortTimeStringFromDate:]を使用して、サンプルコードが現在何をしているのかを確認します。問題のフォーマッタは遅延割り当てが可能で、パージ可能なメモリを使用することで、キャッシュされたフォーマッタをメモリ不足のもとでLRU形式でクリアすることができます。

+0

この特定のケースでは、私は 'NSDate'クラスに' public "APIを追加することも考えました:' [date PDShortTime] '。その後、キャッシュされた 'NSDateFormatter'オブジェクトはシーンの裏でのみアクセスされます。答えをありがとう! – thauburger

+0

NSStringのカテゴリ[NSString shortTimeFromDate:] – ADAM

+0

のように、これはまた素晴らしい方法です。「心配しないでください」という方法はありません。誤ってオブジェクトを誤って変更するのは非常に簡単です。間違いなく回避策を実行してください。これは素晴らしい解決策です。 –

関連する問題