2012-03-20 30 views
1

我有哪里我声明了一个NSMutableArray,然后测试它像这样的情况:在Objective C中,声明的变量是否等于nil?

-(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){}被评估为是和它试图释放对象不存在尚未对第一次通过。如果我尝试if(array != nil){},它也评估为YES。有没有更好的方法来测试这个?

+0

[在Objective-C中,是没有被赋值为零的int变量的可能重复吗?](http://stackoverflow.com/questions/3114952/in-objective-c-are-int-variables -that-havent-been-assigned-a-value-nil) – 2012-03-20 17:32:45

+0

可能的重复[指针总是设置为无声明?](http://stackoverflow.com/questions/9071990/are-pointers-always-set对零宣布) – Monolo 2013-04-09 14:06:57

回答

3

当你宣布你array将其设置为无:

NSMutableArray *array = nil; 

否则,您可以在指针收到垃圾。

+0

非常感谢! – levi 2012-03-20 15:32:17

+2

@levi:同样打开Clang静态分析器来构建。它会解决这个问题。 – JeremyP 2012-03-20 16:01:06

4

变量数组是在栈上声明的,因为它是在函数中声明的;它包含无论是堆在这一点上,这对于很多情况下可以不上NIL

你需要确保初始化变量在这种情况下,所以你应该使用:

NSMutableArray *array = nil; 

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

+0

太棒了!谢谢! – levi 2012-03-20 15:30:26

1

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

-(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为零,因为即使对象被释放,array变量也只是一个指向该对象所在的内存地址的指针,而不会被删除。

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

+0

感谢您的帮助! – levi 2012-03-20 15:31:56