IPHONE: Вопрос об освобождении переменной - PullRequest
0 голосов
/ 27 октября 2009

Рассмотрим этот псевдокод:

// 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 ...], как если бы я возвращал rotatedImage для метода, но если я это сделаю, программа произойдет сбой, поскольку переменная imagePX должна существовать, чтобы можно было оценить строку A.

Другая проблема в том, что изображение B будет перенаправлено в другую процедуру. Итак, каков наилучший способ заставить его работать, не теряя отслеживания imagePX и не просачиваясь?

Какой лучший подход?

Ответы [ 3 ]

3 голосов
/ 27 октября 2009

Нет необходимости выделять экземпляр UIImage. imageWithContentsOfFile является статическим методом и может вызываться для самого класса.

Поскольку imageWithContentsOfFile не включает в себя термины alloc, new или copy, возвращаемый объект (по соглашению) не сохраняется и будет автоматически освобожден при первом сливе пула автоматического выпуска.

И наоборот, если вы когда-либо сталкивались с подобной ситуацией, когда вы не можете понять, почему вы получаете ошибки EXC_BAD_ACCESS при попытке доступа к этому объекту, он, вероятно, был выпущен слишком рано. В этих случаях вы захотите сделать сохранение / разблокировку вручную в рамках этого класса.

1 голос
/ 27 октября 2009

вместо

[[UIImage alloc]initWithContentsOfFile:... bla bla

Используйте

[UIImage imageWithContentsOfFile:...bla bla

Последний будет автоматически выпущен.

0 голосов
/ 27 октября 2009

А как насчет [UIImage imageNamed: @ ""]? Нет выделения, не нужно выпускать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...