Обратите внимание, что ваш код может быть переписан как:
UIImage *image = [[UIImage alloc] initWithData:myData];
UIImage *scaledImage = [image scaleToSize:size];
image = scaledImage;
, поэтому давайте посмотрим, что произойдет:
image
получено через alloc
, следовательно, вы владеете этимобъект scaledImage
получен с помощью метода, который возвращает автоматически выпущенный объект, поскольку UIGraphicsGetImageFromCurrentImageContext()
возвращает автоматически выпущенный объект - у вас есть исходный
image
, но у вас нет scaledImage
,Вы несете ответственность за выпуск оригинала image
, в противном случае у вас есть утечка.
В вашем коде вы используете одну переменную для ссылки на оба объекта: исходное изображение и масштабированное изображение.Это не меняет того факта, что вы владеете первым изображением, поэтому вам нужно его разблокировать, чтобы избежать утечек.Поскольку вы теряете исходную ссылку на изображение при использовании той же переменной, одна общая идиома состоит в том, чтобы отправить -autorelease
исходному объекту:
UIImage *image = [[[UIImage alloc] initWithData:myData] autorelease];
image = [image scaleToSize:size];
Или, если вы предпочитаете выпустить исходное изображение вместо автоматического выпускаэто,
UIImage *image = [[UIImage alloc] initWithData:myData];
UIImage *scaledImage = [image scaleToSize:size];
[image release];
// use scaledImage from this point on, or assign image = scaledImage
ИМО, менять не имеет смысла scaleToSize:
.Это метод экземпляра, который создает (автоматически выпущенное) изображение на основе заданного UIImage
экземпляра.Это похоже на -[NSString stringByAppendingString:]
, который создает (автоматически выпущенную) строку на основе данного NSString
экземпляра.Он не заботится о владении исходной строкой, и то же самое относится и к вашему scaleToSize:
методу.Как бы метод узнал, хочет ли вызывающий сохранить исходное изображение?
Я бы также переименовал scaleToSize:
в imageByScalingToSize
, чтобы сделать его похожим на соглашение об именах Cocoa - вы получаете изображение, применяяоперация с существующим образом.