私のチームは、コードベース全体でさまざまな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を行うよりも安いでしょうか?
ここでは他の方法もありますか?
私たちはこれを実行していますが、「良い」コードを書いてフィードバックを得るのは常に良いことです。
この特定のケースでは、私は 'NSDate'クラスに' public "APIを追加することも考えました:' [date PDShortTime] '。その後、キャッシュされた 'NSDateFormatter'オブジェクトはシーンの裏でのみアクセスされます。答えをありがとう! – thauburger
NSStringのカテゴリ[NSString shortTimeFromDate:] – ADAM
のように、これはまた素晴らしい方法です。「心配しないでください」という方法はありません。誤ってオブジェクトを誤って変更するのは非常に簡単です。間違いなく回避策を実行してください。これは素晴らしい解決策です。 –