2012-02-03 57 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