0

サイクル用にいくつか持っています。このサイクルでは、いくつかのリクエストを行い、応答テキストを取得しました。ループの最後で、何らかの理由でスレッドを数秒間スリープさせ、繰り返しを続けます。[Vk friends] には約 500 個のオブジェクトがあるため、約 500 回繰り返しますが、プログラムが終了すると、起動時よりもはるかに多くのメモリを使用します。ARC を使用していますが、ループで割り当てられたメモリが反復ごとに解放されない理由がわかりません。それは正常ですか、それとも私が間違っているのでしょうか?

for (Friend *friend in [Vk friends]) {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"log" object:[NSString stringWithFormat:@"Visit %i/%i friend (earn %i coins)", ++count, [Vk friends].count, [UserState coins] - coinsBefore]];
    if (friend.helpPoints <= 0) continue;
    strData = [NSString stringWithFormat:@"someparams=somevalues&param1=%@", [Vk authKey]];
    data = [strData dataUsingEncoding:NSUTF8StringEncoding];
    request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://someaddress/somepath?somegetparams=%@", [Vk userId]]]];
    request.HTTPMethod = @"POST";
    [request setValue:[NSString stringWithFormat:@"%i", [data length]] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.43 Safari/536.11" forHTTPHeaderField:@"User-Agent"];
    [request setValue:@"http://blahblah.com" forHTTPHeaderField:@"Origin"];
    [request setValue:@"http://blahblah.com" forHTTPHeaderField:@"Referer"];
    [request setValue:@"ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4" forHTTPHeaderField:@"Accept-Language"];
    [request setValue:@"windows-1251,utf-8;q=0.7,*;q=0.3" forHTTPHeaderField:@"Accept-Charset"];
    [request setHTTPBody:data];
    data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    doc = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    [NSThread sleepForTimeInterval:(helpTimeout + randDouble(min, max)) * 5.0];
}
4

1 に答える 1

5

完全に正常です。メモリを蓄積しすぎていると思われる場合は、for ループの内部を @autoreleasepool でラップして、各ループ反復の最後にメモリを再利用できるようにします。

于 2012-07-02T19:35:58.273 に答える