我正在處理RemoteIO以獲取麥克風輸入並將其修改得很少。有時會崩潰EXC_BAD_ACCESS沒有消息(set NSZombieEnabled)
有時它會崩潰EXC_BAD_ACCESS
並且沒有更多的消息。
發生崩潰的行是這些;
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
解釋代碼,
- 「權力」 是
NSMutableArray
。 [powers count]
總是更大比變量「i」
掙扎了一會兒,我發現修復它的好方法。
一個環境變量。
所以我設置了NSZombieEnabled
和NSDebugEnabled
以便我可以看到崩潰的原因。
但即使我設置了變量,Xcode顯示沒有消息。 (但它正確顯示從其他線路發生崩潰時的消息。)
另外一個奇怪的是,它不會在運行開始後崩潰;它平均在一分鐘內崩潰。 (但時代真的變了。)
這是一個小猜測。當我將比率降低到一半時, 比較穩定。
那麼,這是NSMutableArray
的問題,因爲NSMutableArray
方法趕不上速度的速度?
還是您看到其他一些可能的原因?
============================================== ===========================================
還有一些更多的代碼。 我用這種方式分配的權力..
powers = [[NSMutableArray alloc] initWithCapacity:POWER_ARRAY_SIZE];
,我釋放的權力陣列是..
- (void)dealloc {
[powers release];
[super dealloc];
}
,沒有別的地方。
更詳細的代碼是這樣的。
- (void)drawRect:(CGRect)rect
{
...//Do Something
...//Check "endindex" and "startindex" not to exceed boundary
for (int i = endindex; i > startindex; i-=1)
{
int currPower = [[powers objectAtIndex:i] intValue];
int prevPower = [[powers objectAtIndex:i - 1] intValue];
...//Doing something
}
}
此drawRect:方法是在每毫秒調用從主線程(通過定時器)。
- 更新在該方法中
- (void)setPower:(int)p
{
[powers addObject:[NSNumber numberWithInt:p]];
while ([powers count] > POWER_ARRAY_SIZE){
[powers removeObjectAtIndex:0];
}
}
(更具體地相加)的權力和也這種方法在每毫秒調用。 這是在後臺線程調用。
所以沒有@autoreleasepool的XCode顯示泄漏
這個原因的警報的消息我@autoreleasepool {..}
如果我= 0呢? i-1 <0,你會嘗試訪問Array超出範圍的對象。和郵政編碼有關的權力陣列。在哪裏分配它,你在哪裏釋放它。 – 0x8badf00d 2012-02-03 04:45:48
您使用ARC嗎? – whitelionV 2012-02-03 04:46:04
@whitelionV你的意思是「自動引用計數」?不,我不使用它!它是什麼? – 2012-02-03 05:29:05