在目标C中,声明的变量等于零



我有一个案例,我声明了一个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。有更好的方法来测试这个吗?

变量数组是在堆栈上声明的,因为它是在函数中声明的;它包含了当时堆栈上的任何内容,在很多情况下都可能是非NIL

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

NSMutableArray *array = nil;

您应该为代码执行Product -> Analyze,它将检测到许多像这样的常见错误(以及其他错误)。

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

NSMutableArray *array = nil;

否则,指针中可能会出现垃圾。

我不确定您试图用这段代码实现什么,因为当您进入循环时,声明的数组将始终为"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,因为即使释放了对象,array变量也只是指向对象被删除前所在内存地址的指针,而不会是nil。

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

最新更新