2013-06-06 2 views
0

didFinishLaunchingWithOptions 응용 프로그램에서 매우 명백한 메모리 누수가 발생했습니다. 도구 나이 제대로 작동하지 않을가 생각에 이르게 어느 시점에서 어떤 메모리 누수를 보여주지 그러나명백한 메모리 누출을 감지하지 못하는 계기

NSArray *temp = [[NSArray alloc] initWithArray:[[NSArray alloc] initWithArray:@[]]]; 
temp = [[NSArray alloc] initWithArray:@[]]; 
temp = nil; 

. 다른 사람이 이것을 경험 했습니까?

+0

ARC입니까? 그렇다면 누출 위치는 어디입니까? 하지만 그렇지 않더라도 실제로 힙에 메모리를 할당하지는 않습니다. 유일한 메모리 소비는 로컬 변수 temp에 대한 스택에 있습니다. –

답변

3

제 생각에 비어있는 NSArray는 기본적으로 싱글 톤 인스턴스입니다. 이 방법으로 메모리 누수를 만들 수는 없습니다. 앱에 항상 빈 배열 "singleton"에 대한 참조가 있기 때문입니다.

이 모든 빈 배열이 동일한 메모리 주소를 가리 중임을 보여줍니다 :

NSArray *array1 = [NSArray array]; 
NSArray *array2 = [NSArray arrayWithArray:array1]; 
NSArray *array3 = [NSArray arrayWithArray:@[]]; 
NSArray *array4 = @[]; 
NSArray *array5 = [@[] copy]; 
NSArray *array6 = [[NSArray alloc] initWithArray:[[NSArray alloc] initWithArray:@[]]]; 

NSLog(@"%p", array1); 
NSLog(@"%p", array2); 
NSLog(@"%p", array3); 
NSLog(@"%p", array4); 
NSLog(@"%p", array5); 
NSLog(@"%p", array6); 

응용 프로그램 수명주기에 당신이 빈 배열의 주소를 기록 상관없이, 그것은 항상 동일합니다.

NSMutableArray으로 테스트 해보십시오. 또는 자신이 직접 만든 수업을 사용하는 것이 좋습니다.

내장 클래스를 사용하는 경우 백그라운드에서 무거운 최적화가 진행되는 경우가 있습니다. 예를 들어 이니셜 라이저가 반환하는 정확한 클래스 나이 경우와 같은 싱글 톤 인스턴스를 확인할 수없는 클래스 클러스터의 경우.

관련 문제