Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在目标C中,声明的变量是否等于零?_Objective C_Variables_Nsmutablearray - Fatal编程技术网

Objective c 在目标C中,声明的变量是否等于零?

Objective c 在目标C中,声明的变量是否等于零?,objective-c,variables,nsmutablearray,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

我有一个案例,我声明了一个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
    }
}
-(无效)随便什么{
NsMutableArray*数组;
对于(int i=0;i<10;i++){
if(数组){
[阵列释放];
}
array=[[NsMutableArray alloc]init];
//向数组中添加内容,并在重新开始之前处理这些内容
}
如果([数组计数]>0){
//做点别的
}
}

由于某种原因,
if(array){}
的计算结果为YES,它试图释放第一次通过时还不存在的对象。如果我尝试
if(array!=nil){}
,它的计算结果也是YES。是否有更好的方法来测试此问题?

当您声明
数组时,请将其设置为nil:

NSMutableArray *array = nil;

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

当您声明
数组时,请将其设置为nil:

NSMutableArray *array = nil;

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

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

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

NSMutableArray *array = nil;

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

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

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

NSMutableArray *array = nil;

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

我不确定你用这段代码想要实现什么,因为当你进入循环时,声明的数组总是“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
    }   
}
-(无效)随便什么{
NSMUTABLEARRY*array=nil;
对于(int i=0;i<10;i++){
if(数组){
[阵列释放];
数组=零;
}
array=[[NSMutableArray alloc]init];
//向数组中添加内容,并在重新开始之前处理这些内容
}
如果([数组计数]>0){
//做点别的
}   
}
当释放一个对象时(您确信它的保留计数将达到0,因此它实际上被删除),您应该将
array
设置为nil,因为即使对象被释放,
array
变量也只是指向对象被删除前所在的内存地址的指针,而且不会是零


另外,在声明变量时,do
NSMutableArray*array=nil否则,它可能只是堆栈上的任何垃圾地址,在if子句中不会计算为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
    }   
}
-(无效)随便什么{
NSMUTABLEARRY*array=nil;
对于(int i=0;i<10;i++){
if(数组){
[阵列释放];
数组=零;
}
array=[[NSMutableArray alloc]init];
//向数组中添加内容,并在重新开始之前处理这些内容
}
如果([数组计数]>0){
//做点别的
}   
}
当释放一个对象时(您确信它的保留计数将达到0,因此它实际上被删除),您应该将
array
设置为nil,因为即使对象被释放,
array
变量也只是指向对象被删除前所在的内存地址的指针,而且不会是零


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

@levi:还可以打开来自构建的叮当静态分析器。它会发现这个问题。@levi:同时打开来自构建的叮当声静态分析器。可能的重复可能的重复可能的重复可能的重复