- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Date formatter for displaying dates
static NSDateFormatter *dateFormatter = nil;
if(dateFormatter == nil){
dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
[dateFormatter setDateFormat:NSDateFormatterMediumStyle];
}
为什么我们初始化dateFormatter变量然后立即测试它是否为nil?我在较新的Apple代码中注意到了这一点。好奇!
-Buffalo
答案 0 :(得分:5)
这是因为变量是一个局部静态变量,这意味着即使在本地函数返回或超出范围之后它也会保持其值。因此,第一次执行该函数时,该变量设置为nil。然后,检查nil并初始化变量(这只发生一次)。每次执行该函数时,该变量都将具有非零值,因此不会执行初始化代码块。
答案 1 :(得分:2)
最有可能的原因是它是一个静态变量。换句话说,在方法退出后,其值不应更改。最有可能的原因是,您只需要在每次方法调用时都保留一个变量实例。
答案 2 :(得分:1)
变量是局部静态变量。它的值在方法调用之间保持不变。因此,在第一次调用时,它被初始化为nil,然后将其值重新分配给NSDateFormatter*
实例的地址。在后续调用中,该值为非零(因为它已分配给NSDateFormatter
实例的地址),因此不会重新初始化。
本地静态变量类似于命名空间范围的全局变量。它的值是整个流程的全局值,但它在声明范围内只能 。