在Objective C中,声明的变量是否等于nil?

时间:2012-03-20 15:22:13

标签: objective-c variables nsmutablearray

我有一个案例,我正在声明一个NSMutableArray,然后像这样测试它:

-(void)whatever {
    NsMutableArray *array;

    for(int i = 0; i < 10; i++) {
        if(array){
            [array release];
        }
        array = [[NsMutableArray alloc] init];
        // Add things to the array and do stuff with those things before starting over
    }
    if ([array count] > 0) {
        // Do something else
    }
}

由于某种原因,if(array){}正在评估为YES,并且它正在尝试释放第一次通过时尚不存在的对象。如果我尝试if(array != nil){},它也会评估为YES。有没有更好的方法来测试这个?

3 个答案:

答案 0 :(得分:4)

变量数组在堆栈上声明,因为它在函数中声明了;它包含那时堆栈上的任何东西,在很多情况下可以是非NIL

在这种情况下,您需要确保初始化变量,因此您应该使用:

NSMutableArray *array = nil;

您应该为代码执行Product -> Analyze,这会检测到很多常见错误(以及其他错误)。

答案 1 :(得分:3)

当您声明array将其设置为nil:

NSMutableArray *array = nil;

否则你可能会在指针中得到垃圾。

答案 2 :(得分:1)

我不确定你要用这个代码实现什么,因为当你进入循环时声明的数组总是“nil”。我假设你之前发生了更多的事情,在这种情况下你应该这样做:

-(void)whatever {
    NSMutableArray *array = nil;

    for(int i = 0; i < 10; i++) {
        if(array){
            [array release];
            array = nil;
        }
    array = [[NSMutableArray alloc] init];
    // Add things to the array and do stuff with those things before starting over
    }
    if ([array count] > 0) {
        // Do something else
    }   
}

当释放一个对象时(并且你确定它的保留计数将达到0并因此实际上被删除)那么你应该将array设置为nil,因为即使该对象被释放,{{ 1}}变量只是指向对象在删除之前所在的内存地址的指针,并且不会是nil。

此外,在声明变量时,请执行array,否则它可能只是堆栈上的任何垃圾地址,在if子句中不会计算为nil。