为什么静态变量检查为nil然后分配?

时间:2012-12-27 03:42:43

标签: objective-c ios uitableview

以下代码出现在Apple的iOS开发指南(找到here)中:

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

为什么将formatter设置为nil然后检查它是否为零?在哪种情况下不会?

3 个答案:

答案 0 :(得分:3)

formatter静态变量,仅初始化一次..所以

static NSDateFormatter *formatter = nil;
对于多次执行此功能,

仅执行一次。

简而言之,他们确保重用 formatter对象,而不是每次都创建它。

所以关于你的问题,

  

在哪种情况下不会?

格式化程序对象只有nil才能首次执行该函数,所以代码

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

只会执行一次。

对于更改,静态变量上的wikipedia page易于阅读,并帮助您理解该概念。他们使用C编程语言示例,但概念在目标C中类似。

答案 1 :(得分:1)

这是因为它是static。因此,第一次调用cellForRowAtIndexPath时,formatter确实会nil,因此会初始化为有效NSDateFormatter dateStyle NSDateFormatterMediumStyle 1}}。下次调用此方法时,formatter将不再是nil,您无需再次初始化它。如果你不熟悉static限定符,那么只有一个只能初始化一次的变量的方式,这只是一个方便的(虽然显然很混乱)。

答案 2 :(得分:1)

formatter是静态的,因此它只会被初始化一次。因此,在下次调用此函数时,它可能不会为零。

见这里:http://mobiledevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html