2012-02-24 4 views
0

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

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]; 

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

EDIT:

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

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

ответ

0

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

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

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

0

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

[UIImage imageWithContentsOfFile:(NSString *)name] 
+1

это лучше/быстрее, чем 'initWithContentsOfFile'? –

+0

Я только что попробовал, он потреблял гораздо меньше памяти, чем ваш. –

3

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

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

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

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

+0

в моем методе dealloc я выпущу его ... я добавлю этот код. – MegaManX

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