Не могу найти утечку памяти - PullRequest
1 голос
/ 24 августа 2010

У меня есть довольно простое приложение, которое имеет следующее представление, в котором находится программа:

int currentPageIndex;
NSArray *images;
NSString *nextImage;    
IBOutlet UIImageView *firstPage;
IBOutlet UIButton *bigButton;   

В реализации viewDidLoad я загружаю массив с кучей имен файлов изображений:

images = [NSArray arrayWithObjects:@"image1.jpg", @"image2.jpg", etc, nil];
[images retain];

Каждый раз, когда нажимается bigButton, изображение меняется:

- (IBAction)bigButtonTapped:(id)sender {
    currentPageIndex++;

    nextImage = [images objectAtIndex:currentPageIndex];
    firstPage.image = [UIImage imageNamed:nextImage];
}

Все работает так, как я хочу, за исключением того, что я получаю «Предупреждение о получении памяти. Уровень =1 "в консоли с подключенным устройством. Это предупреждение появляется после каждых 12 изображений или около того, и в конечном итоге происходит сбой с" EXC_BAD_ACCESS "

Я подумал, что на самом деле это будет хорошим способом не помещать впамяти, так как на экране есть только один UIImageView, и его изображение изменяется так, как мне нужно.

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

Ответы [ 5 ]

1 голос
/ 10 апреля 2011

Чтобы не превышать размер массива,

currentPageIndex = 0;

для (currentPageIndex в изображениях) {

DoStuff;

}

OH !!!!! Я ДУМАЮ Я заметил твою проблему. Всякий раз, когда вы используете UIImage imageNamed для загрузки изображений, все изображения остаются в памяти, даже если на них ссылаются используйте другой метод UIImage: contentOfFile.

Еще одна вещь, убедитесь, что ваши изображения оптимизированы для iOS. Используйте .png, когда это возможно.

dibu2z

1 голос
/ 24 августа 2010

Поскольку вы получаете предупреждение памяти, проблема должна заключаться в том, что изображения не выпускаются. Однако в показанном вами коде вы правильно обрабатываете изображения. Таким образом, проблема, скорее всего, в части кода, которую вы нам не показываете.

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

0 голосов
/ 24 августа 2010

Здесь недостаточно информации, чтобы точно сказать, в чем ваша проблема. EXC_BAD_ACCESS обычно происходит, когда вы пытаетесь получить доступ к объектам, которые уже были освобождены.

Самый быстрый способ отследить истинную причину EXC_BAD_ACCESS - использовать исполняемый аргумент NSZombieEnabled, а затем установить точку останова на objc_exception_throw. Это даст вам трассировку стека и позволит вам точно определить, к какому объекту вы пытаетесь получить доступ.

http://www.cocoadev.com/index.pl?NSZombieEnabled

Использование Malloc для отладки

0 голосов
/ 24 августа 2010

Возможно, вы достигли конца массива и пытаетесь получить доступ за концом массива. Вы могли бы сделать

currentPageIndex++;

if ( currentPageIndex < [images count]) {
nextImage = [images objectAtIndex:currentPageIndex];
firstPage.image = [UIImage imageNamed:nextImage];
}

Также возможно, что изображение, которое вы перечислили, не существует в комплекте.

0 голосов
/ 24 августа 2010

Я предполагаю, что изображение является сохраненным свойством.Попробуйте выпустить его в начале вашего bigButtonTapped.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...