2012-02-03 53 views
0

我正在處理RemoteIO以獲取麥克風輸入並將其修改得很少。有時會崩潰EXC_BAD_ACCESS沒有消息(set NSZombieEnabled)

有時它會崩潰EXC_BAD_ACCESS並且沒有更多的消息。

發生崩潰的行是這些;

int currPower = [[powers objectAtIndex:i] intValue]; 
    int prevPower = [[powers objectAtIndex:i - 1] intValue]; 

解釋代碼,

  1. 「權力」 是NSMutableArray
  2. [powers count]總是更大比變量「i」

掙扎了一會兒,我發現修復它的好方法。

一個環境變量。

所以我設置了NSZombieEnabledNSDebugEnabled以便我可以看到崩潰的原因。

但即使我設置了變量,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

如果我= 0呢? i-1 <0,你會嘗試訪問Array超出範圍的對象。和郵政編碼有關的權力陣列。在哪裏分配它,你在哪裏釋放它。 – 0x8badf00d 2012-02-03 04:45:48

+0

您使用ARC嗎? – whitelionV 2012-02-03 04:46:04

+0

@whitelionV你的意思是「自動引用計數」?不,我不使用它!它是什麼? – 2012-02-03 05:29:05

回答

0

我找到了答案。

發生崩潰是因爲objected-C的NSMutableArray有時出錯。

那就是當我試圖用毫秒來做一些事情的時候。

所以我Objective-C的陣列改變到C數組,像

int power[ARRAYSIZE]; 

後,我改變了它,它工作正常。

可能是NSMutableArray並不是那麼輕快才能做到真正快速的事情。

0

如果NSZombies解決您的問題,這意味着阻斷法(setPower)你NSMutableArray正在釋放某處,或者它在一個自動釋放池中。你也可能試圖在你的數組的邊界之外寫入。

  • 如果NSMutableArray是一個自動釋放池手動retainrelease它,當你不再需要它(它是由一個便捷方法,或者你明確autorelease d它創建)。
  • 如果對象不在自動釋放池中,請檢查何時調用該對象的release
  • 分配之前寫一個簡單的警告:

if(i <= 0 || i >= [powers count]) NSLog(@"Here's the problem. i = %d", i);

+0

我發佈了更多代碼。謝謝你的答案,但當我檢查答案,並把你寫的代碼和測試,問題發生與以前相同。 – 2012-02-03 05:49:57