2014-05-01 14 views
1

저는 서버에 연결하여 JSON 데이터를 가져 오는 기본 게임을 진행하고 있습니다. 그것은 약간 게임을 위해 잘 작동하고, 그러나 기억 압력 때문에 곧 후에 부서집니다. 나는 도구를 훑어 보았고 다소 불안해하는 것을 보았습니다. [[Class alloc] init에 의해 인스턴스화 된 거의 모든 인스턴스 변수가 NSZombie 객체로 유출되었습니다.NSZombies & Memory Leaks를 디버깅하는 방법은 무엇입니까?

이미지에서 볼 수 있듯이 5 초 만에 9000 개의 누출이 발생했습니다.

저는 ARC를 사용하고 있습니다.

-(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]; 
    } 

} 

또한 나는 꽤 자주 dataWithContentsOfUrl 방법을 사용

추가 분석은 특정 방법을 사용할 때 내가 유출했다 보여 주었다.

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

    }); 

아무도이 상황을 복구하는 방법이나 내가 잘못하고있는 것을 말해 줄 수 있습니까?

+0

'NSZombieEnabled'가'true '로 설정되어 있습니까? 그렇다면 @ gnasher729가 말했듯이, 어떤 객체도 실제로 할당 해제되지 않습니다 (모두 메모리에 남아 있습니다). 그래서 곧 많은 메모리를 사용할 것입니다. 좀비를 활성화시켜 특정 충돌을 추적 한 다음 다시 사용할 수 없게해야합니다. –

답변

1

. 좀비 오브젝트를 켜면 오브젝트 할당 해제 후 오브젝트 사용을 디버그하여 명백하게 그러한 오브젝트를 누출로 변환합니다. 좀비를 사용하여 디버그하거나 메모리 누수를 동시에 검색 할 수는 없습니다.

0

메모리 누수가 NSData 개체가 메모리에 저장되어 있기 때문에 발생한다고 가정합니다.

NSData을 NSData 개체 대신 파일로 문서 폴더에 저장하려고 했습니까?

예 좀비 오브젝트의 자연 속에서의

[data writeToFile:filePath atomically:YES]; 
+0

아니요 NSData를 저장하지 않습니다. NSZombies를 사용하지 않도록 설정하고 계측기에서 할당을 실행하면 누수가 크게 줄어 듭니다. 그러나 일부 Facebook 통합 메소드가 유출되었습니다 : 예를 들어 내가 최고 고위 게시 : FBGraphPath에서 HTTP GET 메서드를 호출하면 결과 개체를 읽을 때 누수가 표시됩니다. 또한 VM : ImageIO_PNG_Data는 185MB였습니다. 이게 정상인가? 감사합니다. – user2068588

+0

예, 일반적인 문제입니다. [UIImage imageNamed : @ "image.png"]를 사용하고 있다면, 약간의 기억이 필요할 것입니다. 대신 NSCache를 사용해야합니다. – Natarajan