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 루프의 끝에서 메모리가 소모되지 않는 이유를 이해하고 있습니다.
그럼, 질문은 아직 열려 있습니다.
재미있는 ..이 일에 전문가의 의견을 기다리는 중 .. – rdurand
당신은 무엇을'은'for' 문 주위에'@autoreleasepool {...}를 넣으면? – trojanfoe
다른 Foundation 클래스를 사용해 보셨습니까? 다른 유형의 init (initWithBool : 예)은 어떻습니까? – rdurand