Не будет работать с CFRelease, но зомби без него - PullRequest
1 голос
/ 31 января 2012

В этом коде:

            url = [NSURL fileURLWithPath:t.exportedFullName];

            myImageDest = CGImageDestinationCreateWithURL((CFURLRef)url, (CFStringRef)t.asset.defaultRepresentation.UTI, 1, nil);

            if(!myImageDest) {
                NSLog(@"***Could not create image destination ***");
            }
            inImage = t.asset.defaultRepresentation.fullResolutionImage;

            CGImageDestinationAddImage(myImageDest, inImage, (CFDictionaryRef)t.freshMetaData);
            success = CGImageDestinationFinalize(myImageDest);
            if(!success)
                NSLog(@"***Could not create data from image destination ***");

            [url release];
            CGImageRelease(inImage);
            CFRelease(myImageDest);

, который выполняется в цикле, проходящем через массив информации об изображении (t), если я не использую CFRelease (myImageDest); Я получаю предупреждения о нехватке памяти, и приложение в конечном итоге умирает (при запуске на устройстве).

Если я использую его, я получаю:

- [Not A Type _cfTypeID]: сообщение отправлено на освобожденный экземпляр

и профилирование с помощью зомби в инструментах показывает [UIImage dealloc] со значением refcnt, равным -1, а в строке чуть выше - CFRelease со значением refcnt, равным 0, в этом классе выше. Показанный CFRelease - единственный в своем классе.

Не могу жить с этим, не могу жить без ... делай меня сумасшедшим ...

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 31 января 2012

Неправильная строка:

 CGImageRelease(inImage);

Это не нужно, потому что defaultRepresentation.fullResolutionImage не увеличивает количество сохраняемых возвращенных CGImage.

Также [url release] - этоне требуется по той же причине.

0 голосов
/ 31 января 2012
url = [NSURL fileURLWithPath:t.exportedFullName];

потом позже

[url release];

Теперь это плохо.Вы не -alloc / -init, -copy, -mutableCopy и -reretain url, поэтому вы не являетесь его владельцем.Это означает, что его выпуск приводит к перевыпуску экземпляра NSURL.Таким образом, возможно, ваш CGImageRef занимает свое место в памяти, а затем ...

Удалите этот выпуск и вызов функции CFRelease ().По той же причине он не нужен.

...