2011-11-22 49 views
0
if ([diamonds count] == 0) { 
    [self toggleWinLevel]; 
} 

當鑽石是一個NSMutableArray和toggleWinLevel是一個實例方法,如果我運行這個應用程序崩潰與一個EXC_BAD_ACCESS這一行:NSMutableArray中的計數方法拋出一個異常

if ([diamonds count] == 0) { 

它是肯定要做我的數組,因爲這繼續發生,即使當我分配一個int或NSUInteger或NSNumber到我的數組數。我的NSMutableArray被分配並初始化。問題是什麼?

更新1:

伊夫分配,並在這個方法中不會獲取所謂的初始化,它和我的NSLog它不登錄到控制檯證明:

-(void)setUpObjects { 

NSLog(@"Setting Up Objects"); // This is printed in my console 

[levelNumberLabel setHidden:YES]; 
diamonds = [[NSMutableArray alloc] init]; 
rocks = [[NSMutableArray alloc] init]; 

if (levelNumber < 3) { 

    diamonds = [NSMutableArray arrayWithObjects:@"1", nil]; 

} else if (levelNumber > 2 <= 4) { 

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil]; 

} else if (levelNumber > 4 <= 6) { 

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]; 

} else if (levelNumber > 6 <= 10) { 

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", nil]; 

} else if (levelNumber > 10) { 

    diamonds = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5", @"6", nil]; 
} 

if ([diamonds count] > 1 <= 2) { 

    rocks = [NSMutableArray arrayWithObjects:@"1", @"2", nil];     

} else if ([diamonds count] > 2 <= 5) { 

    rocks = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", nil]; 

} else if ([diamonds count] > 5) { 

    rocks = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]; 
} 

[self drawObjects]; 
} 

BTW鑽石(陣列)是一個實例變量

+0

「我的NSMutableArray被分配和初始化」 - 你可以顯示你在哪裏做這個?因爲這似乎是這裏的問題。請包括財產聲明和初始設置代碼。 – jrturton

+0

好的我已經更新了我的問題 – user973985

+0

順便說一句鑽石(數組)是一個實例變量 – user973985

回答

2

你是第一個電話:

diamonds = [[NSMutableArray alloc] init]; 

但稍後再打,例如:

diamonds = [NSMutableArray arrayWithObjects:@"1", nil]; 

第二個呼叫將分配給diamonds一個自動釋放的對象,你需要保留該對象。

您的代碼中存在不一致性,因爲第一次調用時,您有一個保留對象,而不是第二次調用中的自動釋放對象。

+0

......更不用說內存泄漏了。 – jv42

+0

好的,謝謝,我實際上懷疑是這種情況 – user973985

2

最有可能是你過度釋放鑽石數組,換句話說,數組對象已經被釋放,你正試圖爲它調用一個方法。使用NSZombieEnabled = YES參數或有殭屍的工具。

+0

好生病嘗試 – user973985

+0

即時通訊不會釋放數組考慮我只發佈一次,那在dealloc方法 – user973985

+1

事實上,你正在保留它,這使你獲得與訪問隨機存儲器相同的結果。 – jv42

2

無論做什麼ThomasW建議和留住新的數組(但是這會泄露你的原來的實例),或者簡單地添加項目到陣列中,而不是創造一個新問題:

diamonds = [NSMutableArray arrayWithObjects:@"1", nil]; 

應改爲

[diamonds addObjectsFromArray:[NSArray arrayWithObjects:@"1", nil]]; 

這會將對象添加到現有數組中而不是創建新數組。

您已經使用您的alloc/init創建了diamonds數組,您正在將它重新創建爲if語句中的自動發佈變量。

這同樣適用於您的rocks陣列。

+0

謝謝你,這是非常有用的 – user973985