initWithContentsOfFile: путь] управление памятью, когда возвращается ноль - PullRequest
3 голосов
/ 05 июля 2011

[[UIImage alloc] initWithContentsOfFile:path]

возвращает ноль, если метод не может инициализировать изображение.Тогда следующий код не освобождает выделенный UIImage, так как изображение в строке [image release] равно nil:

UIImage* image = [[UIImage alloc] initWithContentsOfFile:path];
if(image)
{
....
}
//Here image is nil and not releases allocated UIImage.
[image release];

Это действительно утечка памяти?

если init возвращает ноль, как это сделатьотпустить объект?если я делаю UIImage * image = [[UIImage alloc] initWithContentsOfFile: path];

и изображение равно nil из-за сбоя init, [выпуск файла] такой же, как [выпуск nil].Хорошо, нет ошибки, но ничего не выходит.

Ответы [ 2 ]

1 голос
/ 05 июля 2011

release на nil - запрет, поэтому всегда хорошо.И он не протечет, так как у вас не было объекта для запуска.

UIImage* test = [UIImage alloc];

test уже сам по себе является UIImage объектом (хотя вам не удалось инициализировать его в этой строке).

Вы действительно должны всегда делать alloc / init в одной и той же строке (и в одной и той же переменной) - иначе действительно трудно следовать логике кода.Ваш код генерирует только один объект, а затем присваивает его другой переменной.

Это то же самое, хотя и гораздо понятнее:

UIImage* test = [[UIImage alloc] initWithContentsOfFile:path];
UIImage* image = test;
int n = [test retainCount]

Здесь очевидно, что test и image являются одним и тем же объектом (и, следовательно, имеют одинаковые retainCount).Всякий раз, когда вы отпускаете один из них, объект исчезает (если вы не retain его раньше).

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

1 голос
/ 05 июля 2011

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

UIImage* test = [UIImage alloc];

и, следовательно, количество сохраняемых единиц будет равно единице, пока вы не отпустите его вручную, поскольку вы являетесь единственным владельцем этого объекта.

См. Правила управления памятью для получения дополнительной информации по этому вопросу.

...