АЙФОН:Вопрос об освобождении переменной
-
06-07-2019 - |
Вопрос
Рассмотрим этот псевдокод:
// an image is initialized
UIImage *imagePX = [[UIImage alloc]initWithContentsOfFile:... bla bla
imagePX = [self rotateImage:imagePX]; //A
[self doStuff:imagePX]; //B
Затем у меня есть метод RotateImage:
- (UIImage*) rotateImage:(UIImage*)source {
... rotate the image... draw on context...
[source drawInRect... bla bla
...
UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
return rotatedImage;
}
Мой вопрос:imagePX так и не был выпущен.Поскольку изображение передается методу RotateImage, я подумал, что могу просто освободить его после использования в команде [source drawInRect...], так как я бы вернул повернутое изображение в методе, но если я это сделаю, программа произойдет сбой, поскольку переменная imagePX должна существовать, чтобы строка A могла выполнить оценку.
Другая моя проблема заключается в том, что изображение будет перенаправлено на B в другую процедуру.Итак, как лучше всего заставить его работать, не теряя imagePX и не допуская утечек?
Какой подход лучше всего?
Решение
Вместо
[[UIImage alloc]initWithContentsOfFile:... bla bla
Использовать
[UIImage imageWithContentsOfFile:...bla bla
Последний будет выпущен автоматически.
Другие советы
Нет необходимости выделять экземпляр UIImage. imageWithContentsOfFile
является статическим методом и может вызываться для самого класса.
Поскольку imageWithContentsOfFile
не включает в себя термины alloc
, new
или copy
возвращаемого объекта (по соглашению ) не сохраняется и будет автоматически освобожден при первом сливе пула автоматического выпуска.
И наоборот, если вы когда-либо сталкивались с подобной ситуацией, когда вы не можете понять, почему вы получаете ошибки EXC_BAD_ACCESS при попытке доступа к этому объекту, скорее всего, он был выпущен слишком рано. В этих случаях вы захотите выполнить сохранение / разблокировку вручную в рамках этого класса.
Как насчет [UIImage imageNamed: @ " "]? Нет, не нужно освобождать)