2012-07-02 5 views
0

У меня есть для цикла. В этом цикле я сделал некоторую просьбу и получил текст ответа. В конце цикла я сглаживаю поток в течение нескольких секунд по какой-то причине и продолжаю итерацию. В [Vk друзья] около 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]; 
} 
+0

Все переменные объявлены выше ... –

ответ

5

Совершенно нормально. Если вы чувствуете, что накопили слишком много памяти, оберните внутреннюю часть цикла for в @autoreleasepool, чтобы она восстанавливала память в конце каждой итерации цикла.

Смежные вопросы