2013-02-17 9 views
0

Я пытаюсь получить последнюю фотографию из рулона камеры iphone. Я использую следующий код:Проблемы с памятью при чтении рулона камеры iphone с AlAssetsLibrary

UIImage* __block image = [[UIImage alloc] init]; 
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; 

[library enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup* group, BOOL* stop) { 

    [group setAssetsFilter:[ALAssetsFilter allPhotos]]; 

    if ([group numberOfAssets] > 0) { 
     [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:[group numberOfAssets]-1] options:NSEnumerationConcurrent usingBlock:^(ALAsset* alAsset, NSUInteger index, BOOL* innerStop) { 
      if (alAsset) { 
       ALAssetRepresentation* rawImage = [alAsset defaultRepresentation]; 
       image = [UIImage imageWithCGImage:[rawImage fullScreenImage]]; 
       [self doTheJobWithImage:image]; 
       // Inside doTheJobWithImage: a segue is also performed at the end 
      } 
     }]; 
    } 
} failureBlock:^(NSError* error) { 
    NSLog(@"Error: %@", [error localizedDescription]); 
}]; 

Он работает, но с недостатками (я использую инструменты и зомби для его отладки):

  • Она читает каждое изображение внутри камеры ролл. Итак, первый вопрос: не перечисляетAssetsAtIndexes: извлекают только указанные изображения (atIndexes)? Что случилось с моим кодом?
  • Добавление к предыдущей проблеме, память становится проблемой, когда много фотографий в рулоне камеры. Мое приложение вылетает, если слишком много, или, если оно работает, кажется, что полученные изображения НИКОГДА не освобождаются, поэтому второй или третий раз я вызываю этот код, он все равно падает из-за утечек памяти. Итак, второй вопрос: как заставить мой код освобождать все после вызова doTheJobWithImage:?

Я использую xcode 4.6, ios 6 и ARC. Заранее спасибо.

ответ

1

Через несколько часов я выяснил, что здесь нет ничего неправильного. Это правильный код для извлечения последней фотографии в рулоне камеры (если кому-то это понадобится). Проблема была в doTheJobWithImage: я решил, что замена

[self doTheJobWithImage:image]; 

и хранить полученное изображение в другом месте, а затем выполнять doTheJobWithImage: после того, как картина перечисление было сделано .. Говоря это только в случае, если кто-то заинтересован.

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

  • Нет связанных вопросов^_^