我尝试使用 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] 并且该组不是 nil。
奇怪的是,如果我创建一个新项目,这段代码可以工作,但在我的旧项目中它就不能工作。
SDK版本为iOS 4.3
在 iPhoneSimulator 4.3 上测试
谁能告诉我发生了什么事?
谢谢。
最佳答案
当您在一个项目上崩溃但在另一个项目上没有崩溃时,您确定设置和配置合适吗?
特别是:
- 检查 TARGET_DEPLOYMENT_OS 是否设置为 ALAsset 框架可用的最低版本。
- 检查您是否包含了所有请求的框架(即使链接器在您忘记包含它时应该发出警告)
此外,崩溃的详细信息(崩溃日志、异常详细信息...)如果有的话会很有帮助。
您还确定 ALAssetLibrary 在枚举(可能是异步完成的)结束之前没有被释放吗?您的问题中的代码中没有 release
但也许您的真实代码中有一个?
AFAIK,enumerateGroupsWithTypes:
以异步方式在辅助线程上执行其 block (请参阅 this other question on SO ),所以这可能是您的问题(您正在尝试使用已从中释放的组内存,因为你开始你的枚举,你必须确保 ALAssetLibrary 仍然在内存中,直到枚举完成)
关于iphone - 如何从相机胶卷中获取照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7583909/