2

我刚刚开始学习用于 iOS 开发的 Objective C。我试图理解以下代码:

- (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;
}

问题一:

声明变量 CellIdentifier 和格式化程序时,“静态”做了什么?如果我不将它们声明为静态,它仍然有效,那么使用静态有什么好处?

Q2:

static NSDateFormatter *formatter = nil;
if (formatter == nil) {

这个表达式不总是正确的吗?为什么我们在那里使用那个 if 语句?

4

2 回答 2

2

static意味着该变量nil在程序启动时设置为一次,而不是每次“运行”该语句时,并且它在多个函数调用中保持其值。

因此,当您第一次调用该函数时,它将触发nil该语句。if对该函数的后续调用会将其设置为非nil值,以便if语句中的代码不会再次运行。

这称为延迟初始化。

于 2012-11-25T22:03:01.070 回答
2

static在这种情况下,这意味着它是多次调用此方法的“共享”变量。第一次调用时,静态变量将是nil. 下一次它将是上次通话期间设置的内容。

于 2012-11-25T22:03:49.160 回答