어떻게 작동하는지 알기 위해 시작 버튼이있는 간단한 iPhone 응용 프로그램을 작성했습니다. 작업을하는 버튼을 트리거 누르면 수행하는 다음NSURLConnection 및 dispatch_async를 사용할 때의 메모리가 공개되지 않음
+ (void)ReportMemory {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if(kerr == KERN_SUCCESS) {
NSLog(@"Memory in use: %u kB", info.resident_size/1024);
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
}
나는 글로벌 큐가 가지고 읽었습니다 :
- (IBAction)start:(id)sender {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@autoreleasepool {
NSString *urlString = @"http://www.aftonbladet.se";
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
NSHTTPURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error) {
NSLog(@"Error: %@", [error localizedDescription]);
}
if (data) {
NSLog(@"Data length: %d", [data length]);
}
if (response) {
NSLog(@"Status code: %d", [(NSHTTPURLResponse*)response statusCode]);
}
[ViewController ReportMemory];
}
});
}
ReportMemory 기능은 다음과 같습니다 autorelease 풀하지만 그들은 간헐적으로 비우는, 그래서 둘 다 시도하고 @autoreleasepool 매크로 않고 시도하고 메모리 차이에 관해서 어떤 차이를 볼 수 없습니다 이자형.
문제는 ReportMemory가 시작 버튼을 누를 때마다 사용되는 메모리가 점점 더 많아지는 이유는 무엇입니까? 나는 자동 릴리즈 풀이 어느 시점에서 비워 질 것이라고 생각했을 것이다. 하지만 제 경우에는 몇 가지 메모리 경고가 나올 때까지 계속해서 더해지며 ReportMemory가 400MB 정도 사용한다고보고하면 응용 프로그램이 종료됩니다.
이와 같은 sendSynchronousRequest의 사용은 데모 용입니다.
'[ViewController ReportMemory];'로 전화를 이동하여 설정 한'@ autoreleasepool '외부 *로 이동하십시오. –
메모리 사용량과 관련하여 아무런 차이가 없지만 버튼을 누를 때마다 커집니다. 그러나 실제 요청이 완료되기 전에 메모리 사용량을 인쇄합니다. – JugsteR
Instruments의 Allocations 템플릿을 사용해 보셨습니까? 특히, 프로그램을 실행하고 버튼을 한 번 클릭하여 (OS 캐시를 미리 예열) 힙샷을 만든 다음 다시 클릭하고 두 번째 힙샷 (실제 테스트 실행)을 수행 한 다음 조금 기다렸다가 할당되지 않은 것을 확인합니다. 테스트 간격 동안 릴리스되었습니다. – ipmcc