Возникли проблемы с утечками памяти - PullRequest
0 голосов
/ 12 марта 2012

У меня много утечек памяти ... Например, у меня есть один UIImageView, изображение которого переворачивается при каждом обновлении (анимация составляет около 30 кадров в секунду, поэтому это изображение обновляется и переворачивает ALOT)

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored];

он получает огромное количество утечек памяти, поэтому я выпустил его после того, как щелкнул один раз:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored];
[image2 release];

но проблема не в том, что если я когда-нибудь попытаюсь снова запустить этот код, приложение зависнет (я полагаю, вы не можете что-то выпустить, а затем использовать это снова? .

Что мне делать? Должен ли я переопределить изображение перед попыткой перевернуть его, если оно было выпущено? Спасибо!

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Вероятно, самый простой подход - сделать image2 сохраненным свойством, а затем присвоить self.image2 вместо простого image2.Это приведет к тому, что старое изображение будет выпущено при назначении нового значения.Но затем вам нужно будет добавить autorelease вызов к вашему [UIImage alloc] init... вызову, чтобы освободить удержание, сделанное alloc.

2 голосов
/ 12 марта 2012

Вы делаете это излишне запутанным, повторно используя то же имя переменной.Добавьте временную переменную.

UIImage* image; // assuming you set this up earlier, and that it's retained
UIImage* flippedImage = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUpMirrored];
// Now we're done with the old image. Release it, so it doesn't leak.
[image release];
// And set the variable "image" to be the new, flipped image:
image = flippedImage;
1 голос
/ 12 марта 2012

Необходимо установить свойство image представления изображения для получающегося изображения, , а затем освободить выделенное изображение. Например:

image2 = [[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored];
self.someImageView.image = image2;
[image2 release];

Кроме того, вы можете просто автоматически вернуть возвращенное изображение. Вот так:

image2 = [[[UIImage alloc] initWithCGImage:image2.CGImage scale:image2.scale orientation:UIImageOrientationUpMirrored] autorelease];
self.someImageView.image = image2;

Редактировать: после того, как вы пояснили, о чем вы спрашиваете, вот лучший способ перевернуть изображение по вертикали.

//lets suppose your image is already set on the image view
imageView.transform = CGAffineTransformIdentity;
imageView.transform = CGAffineTransformMakeScale(1.0, -1.0);

затем, когда вы хотите вернуть его в нормальное состояние:

imageView.transform = CGAffineTransformIdentity;
...