Распределение памяти с помощью imageNamed
Я хочу отобразить некоторые изображения, когда изображение недоступно, я хочу показать изображение по умолчанию. При использовании функции анализа я получаю предупреждения о потенциальной утечке. Я понимаю, что при использовании imageNamed не выделяется память, что может быть хорошим решением? Смотрите ниже часть моего кода
if (!isMyFileThere){
image = [UIImage imageNamed:@"default.png"];
}
else{
image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
}
3 ответа
Это автоматически выпущено
image = [UIImage imageNamed:@"default.png"];
Это не
image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
Вам нужно сделать это:
image = [[[UIImage alloc] initWithContentsOfFile:pngFilePath] autorelease];
Правило таково, если имя вашего метода начинается с alloc
, new
, copy
или же muteableCopy
Вы владеете им и должны освободить его самостоятельно, либо с release
или с autorelease
, Все остальное не ваше, поэтому вы не должны выпускать его.
Если вы позвоните retain
на объекте, вы должны release
(или же autorelease
) это столько же раз:)
Если вы хотите, чтобы объект оставался до тех пор, пока вы не отпустите его вручную, вы должны использовать retain, autorelease добавляет объект в текущий пул NSAutorelease, который очищается в конце каждой итерации цикла выполнения. если вы попытаетесь использовать освобожденный объект, ваша программа потерпит крах.
в iOS 5.0, если вы включите ARC, вам больше не нужно будет использовать "retain", "autorelease" или "release". они добавляются компилятором автоматически.
image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
Вы выполнили выделение, и теперь вы должны его освободить, что может привести к утечке. Другой оператор - объект с автоматическим освобождением.