Утечка памяти NSAutoreleasePool - PullRequest
       35

Утечка памяти NSAutoreleasePool

0 голосов
/ 23 апреля 2011

С инструментами у меня возникла утечка памяти на этом куске кода, и я не понимаю, почему!

-(void)goToThisUrl:(id) targetUrl
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    if (someCondition) {
        // Doing some stuff here
    }
    // Instruments show memory leak on data
    else {
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString: targetUrl]];
        myTargetImage = [UIImage imageWithData:data];
        // When releasing data(because data retainCount = 2), i got:
        // Incorrect decrement of the reference count of an object that is not owned at this point by the caller
        //[data release];
    }   
    [pool release];
}

Спасибо

Ответы [ 2 ]

3 голосов
/ 24 апреля 2011

Выше нет утечки. может иметь одну или несколько утечек в частях, которые вы удалили, и заменить на "someCondition" и "Doing Some stuff here", но никто здесь не может помочь с этим, если вы не опубликуете complete код, который вы действительно тестируете с помощью инструментов.

Также: "// При освобождении данных (потому что data retainCount = 2) ..." Стоп. Правильно. Там. Игнорировать retainCount. Вы освобождаете объект, потому что создали его, используя метод, который подразумевает владение, или потому что вы сохранили его. Вы НИКОГДА не выпускаете объект только потому, что его retainCount имеет значение, которое вы не ожидали или не понимаете. Прочитайте Apple Руководство по программированию управления памятью для подробностей.

0 голосов
/ 27 мая 2011

Во-первых, вы не можете выделить UIImage во втором потоке. Использование UIKit должно быть в основном потоке. Я предполагаю, что вы хотели создать другой поток, чтобы вызвать dataWithContentsOfURL без блокировки основного потока. Но это не правильный подход. Вместо этого используйте NSURLConnection с асинхронным обратным вызовом, который вызывается после завершения загрузки. Apple уже предоставляет встроенный поток «загрузки», который NSURLConnection использует за кулисами. Таким образом, ваш подход к созданию другого потока для загрузки не имеет смысла.

...