1

次のコードは、Apple の iOS 開発ガイド (ここにあります)に記載されています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"BirdSightingCell";

    static NSDateFormatter *formatter = nil;
    if (formatter == nil) {
        formatter = [[NSDateFormatter alloc] init];
        [formatter setDateStyle:NSDateFormatterMediumStyle];
    }
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    BirdSighting *sightingAtIndex = [self.dataController objectInListAtIndex:indexPath.row];
    [[cell textLabel] setText:sightingAtIndex.name];
    [[cell detailTextLabel] setText:[formatter stringFromDate:(NSDate *)sightingAtIndex.date]];
    return cell;
}

フォーマッターを nil に設定してから nil かどうかを確認するのはなぜですか? どのような場合ではないでしょうか?

4

3 に答える 3

3

formatter一度だけ初期化される静的変数です。

static NSDateFormatter *formatter = nil;

この関数を複数回実行する場合は、1 回だけ実行されます。

つまり、オブジェクトを毎回作成するのではなく、再利用するようにしています。formatter

ですから、あなたの質問に関して、

どのような場合ではないでしょうか?

フォーマッタ オブジェクトはnil関数の最初の実行のみに使用されるため、コードは

 formatter = [[NSDateFormatter alloc];
 [formatter setDateStyle:NSDateFormatterMediumStyle];

一度だけ実行されます。

変更については、静的変数に関するウィキペディアのページが読みやすく、概念を理解するのに役立ちます。彼らは C プログラミング言語の例を使用していますが、概念は Objective C と似ています。

于 2012-12-27T03:45:39.253 に答える
1

だからstaticです。そのため、初めてcellForRowAtIndexPath呼び出されると、formatter実際にが呼び出されるため、of でnil有効なとして初期化されます。次回このメソッドが呼び出されると、はなくなり、再度初期化する必要はありません。これは、一度だけ初期化される変数を持つ便利な方法です (ただし、修飾子に慣れていない場合は明らかに混乱します)。NSDateFormatterdateStyleNSDateFormatterMediumStyleformatternilstatic

于 2012-12-27T03:49:29.380 に答える
1

formatter は静的であるため、一度だけ初期化されます。したがって、次にこの関数が呼び出されたときに nil ではない可能性があります。

ここを参照してください: http://mobiledevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

于 2012-12-27T03:51:07.260 に答える