有时会崩溃EXC_BAD_ACCESS没有消息(设置NSZombieEnabled)

时间:2012-02-03 04:37:38

标签: iphone nsmutablearray exc-bad-access nszombie remoteio

我正在处理RemoteIO以获取麦克风输入并稍微修改它们。

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

造成崩溃的行是这些;

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

解释代码,

  1. “powers”是NSMutableArray
  2. [powers count]始终更大而不是变量“i”
  3. 苦苦挣扎了一段时间,我找到了一个很好的解决方法。

    环境变量。

    所以我设置了NSZombieEnabledNSDebugEnabled,以便我可以看到崩溃的原因。

    但即使我设置了变量,Xcode也没有显示任何消息。 (但是当其他行发生崩溃时,它会正确显示消息。)

    另一个奇怪的事情是它在运行开始后不会崩溃; 它平均在一分钟内崩溃。 (但时代真的各不相同。)

    这是一个小猜测。当我把比率降低到以前的一半时, 它更稳定。

    那么,这是NSMutableArray的问题,因为NSMutableArray方法无法赶上速度吗?

    或者您是否看到其他可能的原因?

    =============================================== ==========================================

    还有一些代码。 我以这种方式分配权力..

      powers = [[NSMutableArray alloc] initWithCapacity:POWER_ARRAY_SIZE];
    

    我发布的powers数据是..

      - (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)

2 个答案:

答案 0 :(得分:0)

如果NSZombies解决了您的问题,则表示您的NSMutableArray正在某处释放,或者它位于自动释放池中。你也可能试图在数组的边界外写字。

  • 如果NSMutableArray位于自动发布池中(它是通过便捷方法创建的,或者您是明确autorelease d),请手动retain它和release当您不再需要它。
  • 如果对象不在自动释放池中,请检查何时为该对象调用release
  • 在作业前写一个简单的警告:

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

答案 1 :(得分:0)

我找到了答案。

发生了崩溃,因为NSMutableArray的反对 - 有时候会出错。

当我尝试用它每隔几毫秒做一些事情时。

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

  int power[ARRAYSIZE];

在我更改之后,它运行正常。

可能是NSMutableArray并不是那么快就能做点什么。