2014-04-30 1 views
5

ARC 새 프로젝트를 만들고 didFinishLaunchingWithOptions에이 코드를 삽입하십시오.NSNumber 가능한 메모리 누수

for (int i=0; i < 1000000; i++) { 
    NSNumber* num = [NSNumber numberWithInt:i]; 
    NSLog(@"%@", num); 
} 

NSLog(@"over"); 

응용 프로그램의 메모리가 증가합니다. 또한 for 루프의 끝에서 메모리가 감소하지 않습니다. 당신은 루프 같은에서 대체 할 경우

그러나 :

NSNumber* num = [NSNumber numberWithInt:i]; 

NSNumber* num = [[NSNumber alloc] initWithInt:i]; 

에 의해 그리고 메모리는 안정적으로 유지됩니다.

이것은 예상되는 동작입니까?

편집 :

좋아, 그래서 그 순간을 위해 측면에 didFinishLaunchingWithOptions를 만들어 보자. for 루프를 끝내기 위해 여전히 viewDidLoad를 넣고 0을 제거 할 수 있습니다. 앱 메모리가 ~ 11MB까지 커질 것입니다. for 루프가 끝나면 메모리가 감소하지 않습니다. ~ 11MB로 유지됩니다.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    for (int i=0; i < 100000; i++) { 
     NSNumber* num = [NSNumber numberWithInt:i]; 
     NSLog(@"%@", num); 
    } 

    NSLog(@"over"); 
} 

당신이 가면 :

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    @autoreleasepool { 
     for (int i=0; i < 100000; i++) { 
      NSNumber* num = [NSNumber numberWithInt:i]; 
      NSLog(@"%@", num); 
     } 
    } 

    NSLog(@"over"); 
} 

서프라이즈! 놀람! 똑같은 동작을합니다. ~ 11 MB에 도달하면 메모리가 줄어들지 않습니다. 그러나 루프 안에 @autorelease를 넣는 것은 효과가있을 것입니다.하지만 여기서는 작동 시키려고하지만 for 루프의 끝에서 메모리가 소모되지 않는 이유를 이해하고 있습니다.

그럼, 질문은 아직 열려 있습니다.

+0

재미있는 ..이 일에 전문가의 의견을 기다리는 중 .. – rdurand

+0

당신은 무엇을'은'for' 문 주위에'@autoreleasepool {...}를 넣으면? – trojanfoe

+0

다른 Foundation 클래스를 사용해 보셨습니까? 다른 유형의 init (initWithBool : 예)은 어떻습니까? – rdurand

답변

3

예상됩니다. NSNumber을 alloc/init과 함께 할당하면 ARC는 더 이상 필요없는 즉시 해제합니다.

numberWithInt:과 같은 편리한 방법으로 할당하면 자동 릴리스 풀에 할당 된 객체가됩니다. 자동 풀 풀이 비워 질 때까지 메모리는 해제되지 않습니다. 그러나 다음과 같이 반복을위한 자동 풀 풀을 만들 수 있습니다 :

for (int i=0; i < 1000000; i++) @autoreleasepool { 
    NSNumber* num = [NSNumber numberWithInt:i]; 
    NSLog(@"%@", num); 
} 

NSLog(@"over"); 

이렇게하면 각 반복 반복 후에 숫자를 해제해야합니다.

당신은 여기에서 추가 정보를 얻을 수 있습니다 : Memory Management Policy

+1

이것은 이유가 될 수 없습니다. 메인 쓰레드는 이미 autorelease 풀을 가지고 있으며, 모든 runloop 홉에서 유출됩니다. 그 숫자는'application : didFinishLaunchingWithOptions :'종료 후 잠시 후에 해제 될 것입니다. – hamstergene

+0

@ 트로이안 호 예. 그렇습니다. – Jorge

+0

실제로. 그래도 비정상적인 구문. – trojanfoe