1

どのように機能するかを知るために、スタート ボタンを持つ単純な iPhone アプリケーションを作成しました。そのボタンを押すと、アクションがトリガーされ、次のことが実行されます。

- (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 関数は次のようになります。

+ (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));
}

}

グローバル キューには自動解放プールがあることを読みましたが、それらは断続的に空になるだけなので、@autoreleasepool マクロを使用した場合と使用しない場合の両方を試しましたが、メモリ使用量に関して違いは見られません。

問題は、スタート ボタンを押すたびに ReportMemory が使用するメモリの量を増やして表示するのはなぜですか? ある時点で自動解放プールが空になると思っていたでしょう。しかし、私の場合、いくつかのメモリ警告が表示されるまで加算され続け、ReportMemory が約 400MB の使用を報告すると、アプリケーションはシャットダウンされます。

このような sendSynchronousRequest の使用は、デモンストレーションのみを目的としていることに注意してください。

4

1 に答える 1