user2068588
user2068588

Reputation: 23

How to debug NSZombies & Memory Leaks?

I am working on a basic game, that connects to a server and gets JSON data. It works fine for a few games, but crashes soon after due to memory pressure. I ran through instruments and came across something rather disturbing. Almost every instance variable being instantiated by [[Class alloc]init] was being leaked as a NSZombie object.

As you can see in the image, in 5 seconds I seem to have generated 9000 leaks.

I am using ARC.

Further analysis showed I was leaking when used certain methods:

-(void) playTimeUp
{

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                     pathForResource:@"Gameover"
                                     ofType:@"wav"]];
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
    if (audioPlayer && soundShouldPlay){
        [audioPlayer setDelegate:self];
        [audioPlayer prepareToPlay];
        [audioPlayer setVolume:.20];
        [audioPlayer play];
        [self.audioPlayers addObject:audioPlayer];
    }

} 

Also I use dataWithContentsOfUrl method quite often.

dispatch_async(kBackgroundQueue, ^{
        NSData* data = [NSData dataWithContentsOfURL:completeUrl];
        [self performSelectorOnMainThread:@selector(startMethod:) withObject:data   waitUntilDone:YES];

    });

Could anyone tell me how to salvage this situation, or what I am doing wrong.

Upvotes: 1

Views: 324

Answers (2)

gnasher729
gnasher729

Reputation: 52592

That's in the nature of zombie objects. Turning on zombie objects to debug the use of objects after they have been deallocated will obviously turn any such object into a leak. You can't debug using zombies and search for memory leaks at the same time.

Upvotes: 2

Natarajan
Natarajan

Reputation: 3271

I'm assuming that your memory leaks will be happened due to NSData Object being live on memory.

Did you try to save your NSData to documents folder as a file instead of NSData object?

Example

[data writeToFile:filePath atomically:YES];

Upvotes: 0

Related Questions