2017-02-16 3 views
0

코드 공개하지 : for 루프에서에서NSKeyedArchiver archivedDataWithRootObject : 메모리 useage이 같은

NSMutableData *data = [NSMutableData dataWithLength:10*1024*1024]; 
for (int i = 0; i < 10; i++) { 
    NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:data]; 
    NSLog(@"%lu", (unsigned long)[archiveData length]); 
} 

설정 브레이크 포인트를, 그것은 메모리 useage이 증가 볼 것 같은 : 10메가바이트 -> 20메가바이트 ....-> 100MB, for 루프 밖에서도 여전히 메모리를 해제하지 않습니다.

프로세스를 계속할 때 (다음 메인 루프로 갈 수 있음)에만 메모리 사용량이 100MB 감소합니다.

PS : ARC 켜기/ARC 끄기 및 키워드 사용 해제는 동일한 결과입니다.

답변

2

여기서 볼 수있는 것은 NSAutoreleasePool입니다. 루프를 다음으로 변경하십시오.

for (int i = 0; i < 10; i++) { 
    @autoreleasepool { // new autorelase pool 
     NSData* archiveData = [NSKeyedArchiver archivedDataWithRootObject:data]; 
     NSLog(@"%lu", (unsigned long)[archiveData length]); 
    } // drain autorelease pool 
} 

이렇게하면 실행 시간은 더 짧아 지지만 메모리 영향은 현저하게 줄어 듭니다.

모든 편리한 생성자 ([MyClass myClassWithSomething]과 비슷한 이름 지정)는 자동 보유 풀에있는 객체를 항상 반환합니다 (수동 보유/해제 코드가있는 계약이기 때문에).

"기본"자동 해제 풀은 일반적으로 현재 NSRunLoop에 있으며 각 이벤트 처리주기 후에 해제됩니다. 한주기 내에서 너무 많은 객체를 생성하면 풀이 커지고 커질 것입니다. 따라서 내부 autorelease 풀을 수동으로 생성 할 수 있습니다. 그러면 더 자주 유출됩니다.

+0

나는''@ autoreleasepool'''을 추가하려고하는데, 즉시 메모리를 해제하지 않습니다. 내 문제는 for 루프의 메모리 사용량이 너무 많습니다. for 루프를위한 코드를 추가하려고합니다.''dispatch_async ''', 그것은 작동하지만 나는이 해결책을 좋아하지 않는다. – waitianlou

+0

루프에 따라 달라집니다. 당신이 준 예제는'archivedDataWithRootObject'가 요청한 메모리를 즉시 해제해야하므로 더 많은 코드를 알지 못해도 더 이상 말할 수 없습니다. –

+0

당신은 문제가 있습니다, 문제는 UIPastebord의 메모리가 릴리스가 아닙니다. 나는 또 다른 질문을 게시, 고마워. – waitianlou