Мой iPhone приложение падает после возвращения из фона.Причина: проблема UIImage - PullRequest
0 голосов
/ 23 сентября 2010

Прежде всего, я хочу сказать, что этот сайт УДИВИТЕЛЬНЫЙ!и это помогло мне сделать много вещей при создании приложения для iPhone.

Теперь моя проблема:

Когда я запускаю свое приложение, у меня есть UIImageView, который загружает изображение в зависимости от if/ else операторы в методе

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

.Эти изображения назначаются следующим образом:

BG.image = someImage;

конечно, BG - это UIImageView, а someImage - это iVar с @property, @synthesis.someImage инициализируется изображением из основного пакета в viewDidLoad:

- (void)viewDidLoad {

//init stuff from file
someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"];

[super viewDidLoad];}

Мое приложение работает успешно, загружая изображения в соответствии с touchBegan (как упоминалось), НО!

Когда мое приложение отправленона задний план и возвращается, он падает при первом прикосновении.

Когда я заменил:

BG.image = someImage

на:

BG.image = [UIImage imageNamed:@"FirstViewBG_5N.png"];

он работает счастливо ?!Я думаю, что someImage сброшено или повреждено?

Я не хочу оставлять это так, потому что метод imageNamed читает с диска каждый раз, что, я думаю, приведет к проблемам с производительностью?

Iдумаю мой вопрос понятен?Это то, что:

1- Почему мое приложение вылетает после возвращения из backgroud 2- Как мне решить эту проблему?

Спасибо за помощь!Спасибо!

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

Я предполагаю, что сбой EXC_BAD_ACCESS (но я предполагаю, что вы не опубликовали эту информацию).

Если «someImage» является переменной экземпляра, вы должны синтезировать ее и использовать ее метод доступа (self.someImage), чтобы она была сохранена или скопирована. В настоящее время вы назначаете что-то для некоторого изображения, но оно исчезает к тому времени, когда вы пытаетесь получить к нему доступ позже.

0 голосов
/ 23 сентября 2010

Когда вы делаете это:

- (void)viewDidLoad {

    //init stuff from file
    someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"];

    [super viewDidLoad];
}

Метод imageNamed возвращает автоматически освобожденный объект, который очищается сборщиком мусора после возврата viewDidLoad. Попробуйте либо сохранить его:

    someImage = [[UIImage imageNamed:@"FirstViewBG_5N.png"] retain];

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

    [self setSomeImage:[UIImage imageNamed:@"FirstViewBG_5N.png"]];

или используя инициализатор UIImage initWithData:

    someImage = [[UIImage alloc] initWithContentsOfFile:@"FirstViewBG_5N.png"];

Все они функционально эквивалентны. № 2 или № 3 лучше.

Руководство Apple «Правила управления памятью» спасет вам жизнь: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH

...