0

我正在处理 RemoteIO 以获取麦克风输入并对其进行少量修改。

有时它会崩溃EXC_BAD_ACCESS并且没有更多消息。

导致崩溃的行是这些;

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

解释代码,

  1. “权力”是NSMutableArray
  2. [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{..} 阻止了方法(setPower)

4

2 回答 2

0

如果 NSZombies 解决了您的问题,则意味着您NSMutableArray正在某个地方被释放,或者它在自动释放池中。此外,您可能会尝试在数组范围之外进行写入。

  • 如果NSMutableArray它在一个自动释放池中(它是由一种方便的方法创建的,或者你明确地autoreleased 它)手动retain它和release它当你不再需要它时。
  • 如果对象不在自动释放池中,请检查何时release调用该对象。
  • 在赋值前写一个简单的警告:

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

于 2012-02-03T04:41:58.023 回答
0

我找到了答案。

发生崩溃是因为 objected-C 的 NSMutableArray 有时 ack 错误。

那是我尝试在每毫秒内做某事的时候。

所以我将Objective-C数组更改为C数组,比如

  int power[ARRAYSIZE];

在我改变它之后,它工作正常。

可能是 NSMutableArray 不是那么轻而不能真正快速地做某事。

于 2012-02-15T07:23:02.320 回答