以下代码出现在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然后检查它是否为零?在哪种情况下不会?
答案 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是静态的,因此它只会被初始化一次。因此,在下次调用此函数时,它可能不会为零。