sometimes crash EXC_BAD_ACCESS with no message (set NSZombieEnabled)

399 views Asked by At

I'm handling RemoteIO to get mic inputs and modify them little.

Sometimes it crashes with EXC_BAD_ACCESS and there is no more message.

The lines that make crashes are these;

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

explaining the code,

  1. "powers" is NSMutableArray.
  2. [powers count] was always bigger than variable "i"

Struggling for a while, I found a good way to fix it.

A environment variables.

So I set NSZombieEnabled and also NSDebugEnabled so that I could see the reason of the crashes.

But even though I set the variables, Xcode shows no message. (But it correctly shows messages when a crash occurs from other line.)

Also a weird thing is that it doesn't crash just after the start of run; it crashes in a minute in average. (But the times really varied.)

And this is a little guess. When I decreased the rate to half than before, it was more stable.

So, is it a problem with NSMutableArray, because NSMutableArray method couldn't catch up the speed of the rate?

or do you see some other possible reasons?

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

There are some more codes. I allocated powers in this way..

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

where I release the powers array is..

  - (void)dealloc {
     [powers release];
     [super dealloc];
  }

and no where else.

more detailed code is this.

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

     }
  }

this drawRect: method is calling from Main Thread(By Timer) in every millisecond.

-- updating(more specifically adding) powers in this method

  - (void)setPower:(int)p
  {

     [powers addObject:[NSNumber numberWithInt:p]]; 

     while ([powers count] > POWER_ARRAY_SIZE){
        [powers removeObjectAtIndex:0];
     }
  }

and also this method is calling in every millisecond. and this is calling in background thread.

so without @autoreleasepool XCode Shows message of alert of leaking

for this reason I blocked the method(setPower) with @autoreleasepool{..}

2

There are 2 answers

0
Sallie Lee On BEST ANSWER

I found the answer.

Crashes are occurred because NSMutableArray of objected-C sometimes ack wrong.

That's when I try to do something in every milliseconds with it.

So I changed the Objective-C array to C array, like

  int power[ARRAYSIZE];

and after I changed it, it works fine.

May be NSMutableArray isn't that light to do something really fast.

1
whtlnv On

If NSZombies solved your problem it means that your NSMutableArray is being released somewhere, or it's in an autorelease pool. Also you could be trying to write outside the bounds of your array.

  • If the NSMutableArray is in an autorelease pool (it was created by a convenience method or you explicitly autoreleased it) manually retain it and release it when you no longer need it.
  • If the object is not in an autorelease pool check when the release is called for that object.
  • Write a simple warning before the assignment:

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