2010-04-27 2 views
1

Objective-C에서 메모리 관리 작업을 이해하려고합니다. Activity Monitor에 나열된 메모리 사용량을 보면 메모리가 해제되지 않은 것처럼 보입니다 (열 rsize를 의미 함). 그러나 "Object Allocation"에서 모든 것이 잘 보입니다. 보유하고 멋진 해제, 모든 것이 균형에 관해서는Objective-C에서 메모리가 실제로 해제되는시기는 언제입니까?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 


NSInteger i, k=10000; 
while (k>0) { 
    NSMutableArray *array = [[NSMutableArray alloc]init]; 

    for (i=0;i<1000*k; i++) { 
     NSString *srtring = [[NSString alloc] initWithString:@"string...."]; 
     [array addObject:srtring]; 
     [srtring release]; 
     srtring = nil; 
    } 

    [array release]; 
    array = nil; 
    k-=500; 

} 

[NSThread sleepForTimeInterval:5]; 
[pool release]; 

return 0; 
} 

: 여기 내 간단한 코드입니다. 그러나이 작은 프로그램을 종료 한 후에 만 ​​rsize가 감소합니다. 종료하기 전에 어떻게 든 메모리를 "정리"할 수 있습니까?

+0

예제 코드에서 배열과 문자열은 풀이 비우거나 해제 될 때까지 해제되지 않습니다. 이것은 프로그램이 종료되기 바로 전에 발생합니다. 윌리엄 (Williham)은 정확하며 메모리는 아마도 시스템에 의해 즉시 회수되지 않을 것이라고 말했다. –

+0

[풀 릴리스] 이후에도 메모리는 계속 남아 있습니다. – zhyk

+0

@Matt : 너 무슨 일있어? 여기서는 배열이 바깥 쪽 루프의 끝에서 바로 해제되는 것처럼 보입니다. 자동 릴리즈가 필요 없습니다.'- [release]'는 즉각적입니다. –

답변

2

종료하기 전에 메모리를 지우려고하지 마십시오. 당신은 끝내고 있기 때문에 당신이 소유하고있는 희소 자원은 모두 시스템으로 돌아갑니다.

일반적인 착각은 free() (기본 기계공)이 시스템에 메모리를 즉시 반환한다는 것입니다. 그것은 대부분의 구현에서, 아니라 내부의 자유 목록에 그것을 추가합니다; 응용 프로그램이 사용하기 위해 메모리가 유지되지만 요청하면 시스템이 해제됩니다. 두 번째로 루프가 돌아 오면 응용 프로그램은 시스템에서 더 많은 요청을하기보다는 할당 할 수 있도록이 여유 메모리를 재사용하여 모든 사람이 모든 것을 더 원활하게 만듭니다.

+0

답장을 보내 주셔서 감사합니다.하지만 지금 당장이 자료들이 모두 필요하지 않은 경우. 이 코드가 메인 알고리즘과 같았고, 그 후에 프로그램을 종료하지 않고 결과를 살펴보고 싶다고 가정 해 봅시다. – zhyk

+0

여유 메모리는 나중에 시스템에서 회수 할 수 있습니다. 필요한 경우. 무료 메모리는 무료입니다. 필요한 때까지는 시스템에서 다시 회수하지 않습니다. –

+0

그러나이 간단한 코드는 모든 사용 가능한 메모리를 사용할 수 있습니다. 약 1GB 또는 2GB를 의미하며 아무 것도 일어나지 않습니다. OS가 [풀 릴리스] 후에도 느리게 진행되고 메모리가 해제되지 않습니다. – zhyk

관련 문제