我使用以下代码从照片库中获取图像,在显示它之前调整它的大小收到内存警告。
由于内存压力,它也会被终止。
-(void)readImagesint)getAlbumImages
{
imagesArray = [[NSMutableArray alloc]init];
allImagesArray = [[NSMutableArray alloc] init];
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
void (^assetEnumerator)( ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != nil) {
if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {
[allImagesArray addObject:[result valueForProperty:ALAssetPropertyURLs]];
NSURL *url= (NSURL*) [[result defaultRepresentation]url];
[library assetForURL:url
resultBlock:^(ALAsset *asset) {
[imagesArray addObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]]];
[picsTbl reloadData];
[loadingView setHidden:YES];
}
failureBlock:^(NSError *error){ NSLog(@"test:Fail"); } ];
}
}
else if(result == NULL){
[loadingView setHidden:YES];
}
};
NSMutableArray *assetGroups = [[NSMutableArray alloc] init];
void (^ assetGroupEnumerator) ( ALAssetsGroup *, BOOL *)= ^(ALAssetsGroup *group, BOOL *stop) {
if(group != nil) {
[group enumerateAssetsUsingBlock:assetEnumerator];
[assetGroups addObject:group];
NSLog(@"Number of assets in group :%ld",(long)[group numberOfAssets]);
NSLog(@"asset group is:%@",assetGroups);
}
NSLog(@"[group numberOfAssets] %d",[group numberOfAssets]);
};
assetGroups = [[NSMutableArray alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:assetGroupEnumerator
failureBlock:^(NSError *error) {NSLog(@"A problem occurred");}];
}
请帮忙。
Best Answer-推荐答案 strong>
很明显,您不能将所有张照片作为全屏图像打开并存储在一个数组中,因为这会导致内存压力并最终导致内存故障,这会导致崩溃。
另外,声明
[picsTbl reloadData];
可能有问题,因为它是系统方法的完成处理程序,因此不清楚它在哪个执行上下文中执行。这里,如果 picsTbl 是一个 UITableView 则必须是主线程。您应该确保确实如此。
您需要一种不同的方法来解决您的问题。具体来说,由于您可能正在处理大数据(给定设备受限),您必须确保您只处理 一个 图像,并且一次只将 一个 图像保留在内存中。
您可以了解如何顺序调用异步方法 - 即有效地序列化异步方法,这里:
Force async tasks to run in sequence
ios programming: Using threads to add multiple images to library
关于ios - 从设备照片库中获取图像的内存警告,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/20878847/
|