• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 从设备照片库中获取图像的内存警告

[复制链接]
菜鸟教程小白 发表于 2022-12-12 17:49:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我使用以下代码从照片库中获取图像,在显示它之前调整它的大小收到内存警告。 由于内存压力,它也会被终止。

-(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-推荐答案


很明显,您不能将所有张照片作为全屏图像打开并存储在一个数组中,因为这会导致内存压力并最终导致内存故障,这会导致崩溃。

另外,声明

[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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap