2012-03-20 43 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