Apple代码:将对象初始化为nil,然后

时间:2009-04-17 21:57:55

标签: objective-c

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

3 个答案:

答案 0 :(得分:5)

这是因为变量是一个局部静态变量,这意味着即使在本地函数返回或超出范围之后它也会保持其值。因此,第一次执行该函数时,该变量设置为nil。然后,检查nil并初始化变量(这只发生一次)。每次执行该函数时,该变量都将具有非零值,因此不会执行初始化代码块。

答案 1 :(得分:2)

最有可能的原因是它是一个静态变量。换句话说,在方法退出后,其值不应更改。最有可能的原因是,您只需要在每次方法调用时都保留一个变量实例。

答案 2 :(得分:1)

变量是局部静态变量。它的值在方法调用之间保持不变。因此,在第一次调用时,它被初始化为nil,然后将其值重新分配给NSDateFormatter*实例的地址。在后续调用中,该值为非零(因为它已分配给NSDateFormatter实例的地址),因此不会重新初始化。

本地静态变量类似于命名空间范围的全局变量。它的值是整个流程的全局值,但它在声明范围内只能