(iphone) я создаю утечку при создании нового изображения из изображения? - PullRequest
0 голосов
/ 08 января 2011

У меня следующий код в категории UIImage + Scale.h.

-(UIImage*)scaleToSize:(CGSize)size
{                                                                                                                                                                                     
  UIGraphicsBeginImageContext(size);

  [self drawInRect:CGRectMake(0, 0, size.width, size.height)];

  // is this scaledImage auto-released?                                                                                                                                                                                        
  UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 

  UIGraphicsEndImageContext();

  return scaledImage;
}

Я использую изображение, полученное выше, и использую его следующим образом.

UIImage* image = [[UIImage alloc] initWithData: myData];
image = [image scaleToSize: size]; <- wouldn't this code create a leak since
                                    image(before scaling) is lost somewhere?

Полагаю, что приведенные выше коды работают нормально, если изображение было впервые создано с помощью авто-релиза.
Но если изображение было создано с использованием 'alloc', это приведет к утечке из моих коротких знаний.

Как мне изменить scaleToSize: для защиты от него?

Спасибо

  • РЕДАКТИРОВАТЬ -

Я бы хотелиспользуйте alloc (или retain) / release для UIImage, чтобы я мог хранить # UIImage в памяти в небольшой точке.
(я загружаю много UIImage в цикле, и устройство не может его принять)

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Обратите внимание, что ваш код может быть переписан как:

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 - вы получаете изображение, применяяоперация с существующим образом.

1 голос
/ 08 января 2011

Да, это точно, что у вас есть утечка.На объект, сохраненный ранее в изображении, больше нет ссылок, но он еще не освобожден

...