iPhone / iPad UIImage initWithContentsOfFile: - PullRequest
       11

iPhone / iPad UIImage initWithContentsOfFile:

0 голосов
/ 24 февраля 2012

Я написал код, который, когда вы нажимаете кнопку, открывает новый экран с изображением на нем.На этом новом экране есть кнопка, которая закрывает экран и возвращает к главному экрану.И это работает нормально, если я делаю это так (без утечек и т. Д.):

img = [UIImage imageNamed: @"Galaxy"];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];

Но если я заменю эту строку кода чем-то вроде этого:

img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Minnesota" ofType:@"png"]];
ImageDisplay *display = [[ImageDisplay alloc] initWithImage:img];
[img release];

Это действует как у меня утечка памяти.Каждый раз, когда я открываю изображение экрана, приложение занимает все больше и больше памяти.Но все разлочки вызываются, даже [img retainCount] показывает 1 до окончательного выпуска.Есть ли вероятность, что здесь есть ошибка, потому что я не могу найти, что не так?

EDIT:

Вот метод dealloc для ImageDisplay, и этот метод вызывается:

 -(void) dealloc {
     [img release];
     [super dealloc];
 }

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Ваш ImageDisplay *display сохраняет изображение.Так, как это должно быть.Когда вы отпускаете это, оно должно освобождать все свои сохраненные сущности.В коде, который вы показали, вы не выпускаете его.Типичным использованием было бы сказать контроллеру представления отображать его модально или что-то (или помещать его в контроллер навигации) и освобождать его, оставляя его жизненный цикл в руках любого контроллера представления, который теперь управляет им.Разница в том, что в вашем первом примере кода *img автоматически высвобождается и будет выпускать себя при необходимости, а во втором - нет.

ARC сохранит ваш бекон здесь и значительно упростит ваш код.

Также вам следует использовать термин «статический метод», потому что вы действительно усердно работаете, чтобы вызывать статические методы как экземпляры класса объектов, что походит на то, чтобы обойти свою задницу, чтобы добраться до локтя.

ТАКЖЕ, перестаньте смотреть на retainCount.Все виды вещей могут удерживать ваши объекты под капотом каркаса.Использование retainCount в качестве части вашей стратегии отладки - это билет в один конец для путаницы.

0 голосов
/ 24 февраля 2012

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

 [UIImage imageWithContentsOfFile:(NSString *)name]
0 голосов
/ 24 февраля 2012

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

UIImage *myImage = [UIImage imageNamed:@"pony.png"];

Ваш опубликованный код с использованием initWithContentsOfFile выглядит правильно, поэтому утечка должна быть где-то в вашем классе ImageDisplay.

...