Какой правильный способ выделить UIImage для памяти и освободить его iphone - PullRequest
2 голосов
/ 24 марта 2010

Используя инструменты, я продолжаю указывать на утечку памяти с помощью UIImage.
Я думаю, что я назначаю и освобождаю память правильно. Протекший объект в инструментах описывается как NSConcreteData

Является ли следующий правильный способ назначения и освобождения UIImage?

UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];    
[flagimg release];
flagimg =nil;

Ответы [ 3 ]

8 голосов
/ 24 марта 2010

[UIImage imageWithData:] возвращает автоматически выпущенный объект, который не должен быть снова выпущен вами. Таким образом, этот фрагмент кода содержит не утечку памяти, а наоборот, двойное освобождение (в худшем случае).

Обратите внимание, что инструменты иногда генерируют ложные срабатывания и / или сообщают об утечках памяти в самом фундаменте (да, они тоже допускают ошибки: -).

Самый быстрый способ выделить / освободить объект - это избежать удобных инициализаторов (таких как imageWithData :) и вместо этого что-то вроде

NSData* data = [[NSData alloc] initWithContentsOfURL:url]];<br> UIImage* img = [[UIImage alloc] initWithData:data];<br> [data release];<br> // use your image<br> [img release];

Это сразу выделит и освободит ваш объект, а не будет ждать очистки пула автоматического выпуска.

Но учтите также, что утечка памяти, как правило, не является памятью, которая не пока не освобождена, а потеряна и больше не может быть освобождена , поэтому объект, который будет освобождение из пула автоматического выпуска не считается утечкой памяти.

1 голос
/ 24 марта 2010

как правило, вы можете сказать

если вы создаете объект, в котором есть «init», «copy» или «retain», вы должны освободить его. если нет, то вы получите объект, выпущенный автоматически.

это не всегда так, но в большинстве случаев

0 голосов
/ 24 марта 2010

и imageWithData, и dataWithContentsOfURL возвращают автоматически освобожденные объекты, поэтому в этом фрагменте кода не должно быть утечек памяти.

Поскольку flagimg возвращается автоматически, ваш [flagimg release]; вызов не требуется; вы переиздаваете этот объект.

...