2011-10-28 8 views
1

カレンダーのようなアプリやアプリの一部では、多くのルーチンで(グレゴリオン)カレンダーを使用する必要があります。つまり、alloc-initを実行して同じNSCalendarオブジェクトを何度もリリースする必要があります。永続的なコントローラインスタンスでivar(@property(nonatomic,retain))として1つのNSCalendar(グレゴリオ暦)を保持しますか?永続的使用のためにNSCalendarオブジェクトを保持する必要がありますか?

インスタンスメソッドはリエントラントかスレッドセーフですか?

+0

私はしばらくの間周りを保つことに何の問題もありません。 – JeremyP

+0

NSCalendar/NSDateFormatterが本当にスレッドセーフであるかどうかは、私が証明する正当な情報源はありませんが、疑問です。私は他の人のコメントが、そうではないことを示唆しているのを見る。 – ZhangChn

答えて

6

一般的に、カレンダーや日付フォーマッタは、最初に作成したり使用したりするのに費用がかかります(難しいことがわかりました)。しかし

Thread Safety SummaryリストNSCalendarと「スレッド安全でない」としてNSFormatter(NSDateFormatterのスーパークラス)、両方が言って:

次のクラスと関数は、一般的にスレッドセーフではありません。ほとんどの場合、これらのクラスは、一度に1つのスレッドからのみ使用する限り、どのスレッドからでも使用できます。詳細については、クラスのドキュメントを参照してください。

私は両方を行う方法をお勧めします。これは、NSThreadを使用してスレッドを自分で作成する利点の1つです。各スレッドのカレンダーをthread dictionaryに隠すことができます。

それ以外の場合は、毎回各カレンダーを作成して捨てて、パフォーマンスコストを支払うだけです。

+0

あなたの推論は立っているようです。しかし、私はこの問題に注意を払うつもりです。 – ZhangChn

+0

または、ロックを利用してグローバルカレンダーへのアクセスを同期させることができます。したがって、どのスレッドからでもアクセスできます。 objc_sync_enter/objc_sync_exit'をSwiftで実行します。グローバルカレンダーオブジェクトを同期対象のオブジェクトとして使用します。 –

+0

@MichaelWaterfallこれは、コードのその部分だけを保護するもので、カレンダーを使用する他のコード(フレームワークを含むがこれに限定されないフレームワークのコードを含む)では同期しません。 –

関連する問題