Проблемы с памятью при изменении свойства представления в UIImageView - PullRequest
0 голосов
/ 07 мая 2011

Я использую UITableView внутри popover (iPad), чтобы выбрать изображение из каталога документов. Это изображение затем отображается в UIImageView. Вот код, который я использую, чтобы поместить новое изображение в UIImageView:

- (void)changeImage:(NSString *)imageFilename {

    NSLog(@"changeImage to: %@", imageFilename);    

    NSFileManager *fileMgr;
    fileMgr = [NSFileManager defaultManager];

    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = [dirPaths objectAtIndex:0];

    NSString *imagePath = [docsDir stringByAppendingPathComponent:imageFilename];

    UIImage *newImage = [UIImage imageWithContentsOfFile:imagePath];

    NSLog(@"Path for new image: %@", imagePath);

    self.imageView.image = newImage;
    [newImage release];

    [fileMgr release];

}

Это всегда хорошо работает в первый раз, но всякий раз, когда я пытаюсь снова изменить отображаемое изображение из всплывающего окна, я получаю следующую ошибку: Программа получила сигнал: «EXC_BAD_ACCESS».

Я сузил проблему до этой строки:

self.imageView.image = newImage;

Я пытался добавить следующее до этой строки:

self.imageView.image = nil;

Это не имело никакого значения. Я не могу понять, почему это работает в первый раз, но больше не повторится в следующий раз.

Буду очень признателен за любую помощь.

Ответы [ 3 ]

1 голос
/ 08 мая 2011

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

0 голосов
/ 08 мая 2011

Удалите [newImage release]; из вашего кода, и все будет в порядке!

Вы не выделили / не сохранили / не обновили newImage , поэтому вам не нужно его выпускать.

Это работает в первый раз, потому что UIImage *newImage = [UIImage imageWithContentsOfFile:imagePath]; вернул вам объект autorelease'd, который действителен для текущего цикла выполнения, но вы перезапускаете его, и когда цикл выполнения пытается использовать его снова и, следовательно, EXC_BAD_ACCESS сигнал.

0 голосов
/ 08 мая 2011

У меня нет глубокого понимания Objective-C, но я думаю, что вы должны скопировать изображение:

self.imageView.image = [newImage copy];
...