2010-06-03 2 views
1

Я изменяю изображение в UIImageView на основе входа акселерометра. Изображения сохраняются в массиве. Приложение работает нормально, а затем сбой.UIIMageView, предупреждение: check_safe_call: невозможно восстановить текущий кадр

предупреждение: check_safe_call: не может восстановить текущий кадр

  1. Я не использую метод "UIImage ImageNamed" при заполнении массива.
  2. Общий размер всех изображений составляет около 12 Мб. Но отдельные изображения очень легкие (< 100 kb), и я использую только одно изображение за раз из массива.
  3. На всякий случай есть какие-либо авторелеады, я выделил NSAutoreleasePool в поле зрения, загрузил и осушил его в методе didReceiveMemoryWarning (который вызывает вызов 2, 3 раза до сбоя приложения?).

Ниже приведен код, который создает массив изображения:

//create autorelease pool as we are creating many autoreleased objects 
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

NSMutableArray *finalarr = [[NSMutableArray alloc] initWithCapacity:9]; 

NSLog(@"start loading"); 
for(int y = 0; y < 100; y+=10) 
{ 
    NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:10]; 
    for(int x = 0; x < 10; x++) 
    { 
     NSString *imageName = [[NSString alloc] initWithFormat:@"0%d",y + x]; 

     UIImage *img = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]]; 
     [arr addObject:img]; 

     [imageName release]; 
     [img release]; 
    } 
    [finalarr addObject:arr]; 
    [arr release]; 

} 

NSLog(@"done loading"); 
// Override point for customization after app launch 
viewController.imagesArray = finalarr; 
[finalarr release]; 
//retain the array of images 
[viewController.imagesArray retain]; 

//release the aurtorelease pool to free memory taken up by objects enqued for release 
[pool release]; 

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

После этого следующий метод вызывается из [акселерометра didAccelerate]

-(BOOL)setImageForX:(int)x andY:(int)y 
{ 
[self.imageView setImage:(UIImage*)[(NSArray*)[self.imagesArray objectAtIndex:y] objectAtIndex:x]]; 
return TRUE; 
} 

Таким образом, выполняется только код является «UIImageView setImage». Но здесь не создаются объекты.

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

Благодаря,
Swapnil

ответ

2

NSAutoreleasePool должны быть выделены и выпустили в тот же метод. Выделение его в одном месте и освобождение его в другом случае, как правило, очень плохое (например, код, который вы вставили, использует его правильно)

Загрузка изображений в память будет распаковать их; сжатый PNG на 100 Кбайт может быть без сжатия 2 МБ.

Вы также, кажется, имеет дополнительный retain вызов, который не должен быть там: [viewController.imagesArray retain]; (я предполагаю, что свойство imagesArray отмечено copy или retain и не assign)

+0

вау! спасибо за подсказку декомпрессии изображения. Я этого не знал. – lukya

+1

Кроме того, вы были свободны от дополнительного звонка. удалил! – lukya

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