0

私は、David Mark らの More iOS6 Development book に取り組んでいますが、tableviewcell クラス内で静的な NSDateFormatter インスタンスを宣言することに関連する問題に戸惑っています。

サンプル プログラムでは、ある時点でリーダーに、日付の入力に使用されるセル オブジェクトを作成するための tableviewcell クラスを作成させます。それらは、その tableviewcell クラス内で静的な NSDateFormatter インスタンスの宣言をアドバイスします。彼らは論理的根拠を次のように説明しています。 NSDate をフォーマットするたびに新しいインスタンス"

コードは次のとおりです。

#import "SuperDBDateCell.h"
static NSDateFormatter *__dateFormatter = nil;
@interface SuperDBDateCell ()
@property (strong, nonatomic) UIDatePicker *datePicker;
- (IBAction)datePickerChanged:(id)sender;
@end
@implementation SuperDBDateCell
+ (void)initialize
{
    __dateFormatter = [[NSDateFormatter alloc] init];
    [__dateFormatter setDateStyle:NSDateFormatterMediumStyle];
}

私が理解していないのは、このテーブルビューセルを含むビューが消えたときにインスタンス _dateFormatter に何が起こるかです...つまり、この静的変数はその時点で割り当て解除されていないため、インスタンスを含む親ビューのたびに再作成されますこの tableviewcell クラスは再作成されますか? そうでない場合、なぜですか?

助けてくれてありがとう...私はSOとアップルの開発者サイトも調べてきましたが、それを説明するものはまだ見つかりませんでした...

4

1 に答える 1

2

クラス メソッドは、アプリのinitialize有効期間中に 1 回だけ呼び出されます。したがって、静的__dateFormatterは一度初期化されます。アプリの存続期間中に割り当てが解除されることはありません。それが静的変数のポイントです。クラスのインスタンスに結び付けられることはありません。インスタンスのスコープ外に存在します。

新しいデータ フォーマッタを明示的に設定または割り当てるコードを追加しない限り、その値はそのまま残り__dateFormatterます。nil

補足 - このようなコードの使用には 1 つの問題があります。ユーザーがアプリをバックグラウンドに置いてから、設定アプリで地域形式の設定を変更し、アプリに戻った場合、この日付フォーマッターは引き続き古い形式を使用します。フォーマッターを含むクラスがある場合は常に、NSCurrentLocaleDidChangeNotification通知をリッスンして、長期間有効なフォーマッターを更新して新しいロケールを反映できるようにすることが理想的です。

于 2013-07-19T20:58:26.193 に答える