2009-10-27 2 views
0

Рассмотрим этот псевдо-код:IPhone: Вопрос об освобождении переменной

// 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 и утечки?

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

ответ

1

Вместо

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

Использование

[UIImage imageWithContentsOfFile:...bla bla 

последний будет autoreleased.

+0

конечно! Я забыл изображениеWithContentsOfFile! Я рассматривал тот, который я использовал, и [UIImage imageNamed ...], но этот последний кэширует изображение, используя память, которую я пытаюсь сохранить, потому что я пытаюсь поместить свое приложение в диету памяти. Благодаря! – SpaceDog

0

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

3

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

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

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

Смежные вопросы