Проблема утечки памяти на NSURLConnection - PullRequest
1 голос
/ 23 февраля 2012

Я создал класс для загрузки изображений из Интернета. Проблема заключается в утечке памяти. Так как это было вызвано несколько раз. Все загружаемые изображения вызываются с помощью этого метода. Поскольку источник изображений неограничен, утечка увеличивается.

Трассировка стека не показывает утечки кода, кроме main .

Утечка объекта: Маллок 144, 176, 128, 160 байт.

Resposable Library: CFNetwork

Ответственный кадр: createCanonicalURL

Трассировка стека:

   0 CFNetwork createCanonicalURL
   1 CFNetwork HTTPProtocol::_createMutableCanonicalRequest(__CFAllocator const*, _CFURLRequest const*, void const*)
   2 CFNetwork HTTPProtocol::_createCanonicalRequest(__CFAllocator const*, _CFURLRequest const*, void const*)
   3 CFNetwork HTTPProtocol::copyCanonicalRequest()
   4 CFNetwork URLConnectionLoader::copyProtocolCanonicalRequest()
   5 CFNetwork URLConnectionClient::getRequestForTransmission(unsigned char, _CFURLResponse*, _CFURLRequest const*, __CFError**)
   6 CFNetwork URLConnectionClient::_clientWillSendRequest(_CFURLRequest const*, _CFURLResponse*, URLConnectionClient::ClientConnectionEventQueue*)
   7 CFNetwork URLConnectionClient::ClientConnectionEventQueue::processAllEventsAndConsumePayload(XConnectionEventInfo<XClientEvent, XClientEventParams>*, long)
   8 CFNetwork URLConnectionClient::processEvents()
   9 CFNetwork MultiplexerSource::perform()
  10 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
  11 CoreFoundation __CFRunLoopDoSources0
  12 CoreFoundation __CFRunLoopRun
  13 CoreFoundation CFRunLoopRunSpecific
  14 CoreFoundation CFRunLoopRunInMode
  15 GraphicsServices GSEventRunModal
  16 GraphicsServices GSEventRun
  17 UIKit UIApplicationMain
  18 Interior News main /iPhone Ongoing Projces/WAN_Interiors/Latest_Interior_News_V_1_2/Latest_Interior_News/main.m:14
  19 Interior News start

объект соединения правильно освобожден.

Это также входит в устройство тоже. Большинство из них говорят, что это ошибка в NSURLConnection, некоторые говорят, что есть работа вокруг, а некоторые говорят, что нет

Я попытался установить как большинство упомянутых

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];

но бесполезно ...

Пожалуйста, совет

Код

if (connectionForImage==nil) 
    {

        NSString * fullImagePath = [rootURLForImage stringByAppendingPathComponent:imagePath];
        NSString * trimedstring = [fullImagePath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        NSString * percentEscapedUrl = [trimedstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];



        NSLog(@"Trimmed :%@",trimedstring);
        NSLog(@"PercentEscaped %@",percentEscapedUrl);

        NSURLRequest * imageRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:percentEscapedUrl] cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:6.0];

        [[NSURLCache sharedURLCache] setMemoryCapacity:0];
        [[NSURLCache sharedURLCache] setDiskCapacity:0];



        connectionForImage =[[NSURLConnection alloc] initWithRequest:imageRequest delegate:self];


    }

Соединение для образа освобождается при завершении загрузки и ошибке.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

NSURLConnection немного печально известен небольшими утечками.Если я правильно читаю вашу информацию, это около половины КБ.Вы уверены, что это является причиной ваших проблем с памятью?Возможно, вы захотите дважды проверить с помощью кучи и убедиться, что вы не накапливаете память другим способом.Не все накопления памяти будут отображаться как утечки.

По моему опыту, если вы используете NSURLConnection и особенно UIWebKit, у вас, как правило, будут небольшие (сто байтов за раз) утечки для борьбы.

0 голосов
/ 23 февраля 2012

Я попробовал ASIHTTPRequest, тогда я обнаружил ошибку badurl.Я проверил URL. Похоже, он имеет формат http: /www.example.com, а не http://www.example.com. Позже выяснилось, что код

NSString * fullImagePath = [rootURLForImage stringByAppendingPathComponent: imagePath];была проблема.

это была та, которая перенастраивала косую черту с http: // поэтому изменил мой код на

 NSString * fullImagePath = [rootURLForImage stringByAppendingPathComponent:imagePath];
        NSString * trimedstring = [imagePath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        NSString * percentEscapedUrl = [trimedstring stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


        NSURL * rootURL = [NSURL URLWithString:rootURLForImage];
        NSURL * finalURL = [NSURL URLWithString:percentEscapedUrl relativeToURL:rootURL];

        NSURLRequest * imageRequest = [NSURLRequest requestWithURL:finalURL cachePolicy:NSURLCacheStorageNotAllowed timeoutInterval:60.0];

        [[NSURLCache sharedURLCache] setMemoryCapacity:0];
        [[NSURLCache sharedURLCache] setDiskCapacity:0];



        connectionForImage =[[NSURLConnection alloc] initWithRequest:imageRequest delegate:self];
0 голосов
/ 23 февраля 2012

Если 4.x и выше, просто откройте свой xcode и нажмите option + command + R. Откроется окно, затем нажмите кнопку «Добавить», введите «NSZombieEnabled» и установите значение «YES».

...