Как получить фото из фотопленки?

Я пробовал использовать ALAssetLibrary для получения альбомов и фотографий. Это мой код:

void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
        if(result != NULL) {
            NSLog(@"See Asset: %@", result);
        }
    };

    void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) =  ^(ALAssetsGroup *group, BOOL *stop) {
        if(group != nil) {
            [group enumerateAssetsUsingBlock:assetEnumerator];
        }
    };

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    [library enumerateGroupsWithTypes:ALAssetsGroupAll
                           usingBlock:assetGroupEnumerator
                         failureBlock: ^(NSError *error) {
                             NSLog(@"Failure");
                         }];

Я получаю exc_bad_access на: [group enumarateAssetsUsingBlock: assetEnumerator], и группа не равна нулю.

Странно то, что этот код работает, если я создаю новый проект, но в моем старом проекте он не работает.

Версия SDK - iOS 4.3.

Проверено на iPhoneSimulator 4.3

Может ли кто-нибудь дать мне представление о том, что происходит?

Спасибо.


person Andrei Tut    schedule 28.09.2011    source источник


Ответы (1)


Уверены ли вы, что при сбое в одном проекте, но не в другом, настройки и конфигурации подходят?

Особенно:

  • Убедитесь, что для TARGET_DEPLOYMENT_OS задана минимальная версия, доступная для платформы ALAsset.
  • Убедитесь, что вы включили все запрошенные фреймворки (даже если компоновщик должен предупредить об этом, если вы забыли включить его)

Более того, подробности сбоя (журнал сбоев, сведения об исключениях, ...) были бы полезны, если таковые имеются.

Также уверены ли вы, что ALAssetLibrary не выпущен до завершения перечисления (которое, вероятно, выполняется асинхронно)? В вашем вопросе нет release в вашем коде, но, может быть, он есть в вашем реальном коде?

AFAIK, enumerateGroupsWithTypes: выполняет свой блок во вторичном потоке асинхронно (см. этот другой вопрос о SO), так что, вероятно, это ваша проблема (вы пытаетесь использовать группу, которая была освобождена из памяти с момента начала перечисления, вы должны быть уверены, что ALAssetLibrary все еще находится в памяти, пока перечисление не будет выполнено )

person AliSoftware    schedule 28.09.2011