ALAsset 指针在访问时抛出 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】ALAsset 指针在访问时抛出 EXC_BAD_ACCESS【英文标题】:ALAsset pointer throw EXC_BAD_ACCESS when access it 【发布时间】:2014-02-04 14:24:28 【问题描述】:

我正在开发一个图片库,允许从 iPhone 中选择一些图片并显示它们。

关于这个画廊的一些解释:

UITableView 显示包含 iPhone 图片的不同目录 当用户单击这些目录之一时:显示一个UICollectionView,其中包含所选目录中的不同图片 返回按钮返回UITableView 下一步按钮可在新页面中显示所选图像。

这个画廊是如何实现的:

对于在 iPhone 图片中找到的每个目录,将ALAssetsGroup 存储在名为directoriesData 的NSMutableArray 中 在UITableView 中显示存储在directoriesData 中的目录。 当用户选择一个目录时:将该目录中包含的每个ALAsset 存储在一个名为picturesData 的NSMutableArray 中。 在图片数据的UICollectionView 中显示缩略图。 当用户选择一张图片时,它会存储在名为 desiredPictures 的 NSMutableArray 的单例实例中。 如果用户单击后退按钮,我会在显示 UITableView 之前从图片数据中删除所有对象。

现在的问题:

我的 iPhone 中有两个不同的图片目录。

目录 A 目录B

我想在目录 A 中选择一张图片,在目录 B 中选择另一张图片。

选择它们后,我点击下一页显示它们。

新页面从所需图片加载图像。 但是当我想通过访问目录A的ALAsset来显示所选图片时,我有一个EXC_BAD_ACCESS

在我的项目中进行了一些测试和研究后,我发现如果我不从图片数据中删除对象(当我按下按钮返回时),我不再有EXC_BAD_ACCESS

但是,我需要清理图片数据的内容,因为当我填写我的UICollectionView 时,它来自图片数据。而在我访问目录A再访问目录B的情况下,我会在UICollectionView中得到这两个目录的内容。

那么我怎样才能保持ALAsset 指针正确和干净的图片数据呢?

希望你能理解我的项目和问题。

谢谢!

编辑:

回溯

* 线程 #29:tid = 0x599a6, 0x39764b26 libobjc.A.dylibobjc_msgSend + 6, queue = 'com.apple.root.high-priority, stop reason = EXC_BAD_ACCESS (code=1, address=0xc) frame #0: 0x39764b26 libobjc.A.dylibobjc_msgSend + 6 帧 #1: 0x00195f1a MyProject-[Picture getFullImage](self=0x176ebb40, _cmd=0x005de393) + 310 at Picture.m:211 frame #2: 0x001959bc MyProject-[Picture getCroppedImage](self=0x176ebb40, _cmd=0x005da2b4) + 68 at Picture.m:154 帧 #3:0x001f9a82 MyProject__68-[ImageCropViewController sliderContentsAddContent:ToSlider:AtPage:]_block_invoke(.block_descriptor=0x17637000) + 50 at ImageCropViewController.m:1020 frame #4: 0x39c4cd1a libdispatch.dylib_dispatch_call_block_and_release + 10 帧 #5:0x39c53d70 libdispatch.dylib_dispatch_root_queue_drain + 220 frame #6: 0x39c53f58 libdispatch.dylib_dispatch_worker_thread2 + 56 第 7 帧:0x39d8edbe libsystem_pthread.dylib`_pthread_wqthread + 298

【问题讨论】:

什么?您将所有图像存储在 NSMutableArray 中? 当用户在第一页选择一个目录时,我将所选目录的所有 ALAsset(图像)存储在一个 NSMutableArray 中。我使用这个 NSMutableArray 来填充 UICollectionView。 显示异常消息和完整的堆栈跟踪。 首先,您不应该将图像存储在您做错的数组中。 Bcz 稍后它会产生内存压力。 我只是在我的第一篇文章中添加了回溯 【参考方案1】:

Apple 提供了一种简洁的方式来完成您想要实现的目标。

这里是示例代码:MyImagePicker

并尝试分析代码,看看他们在做什么。!

【讨论】:

感谢您的回答。在 MyImagePicker 中,开发人员也使用 NSMutableArray 来存储所需目录的目录和图片。我在我的项目中做同样的事情。 但是您应该只存储资产 url 而不是整个图像。否则你很快就会收到内存警告。!! 当您谈论“资产 url”时,您谈论的是整个 ALAsset 对象或 myALAssetObject.defaultRepresentation.url ? 我的意思是整个 ALAsset 对象。 是的,这就是我要存储的内容。当然不是图片。

以上是关于ALAsset 指针在访问时抛出 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

在使用 java 运行 Hadoop map reduce 作业时抛出空指针异常

PMS 初始化时抛出 installd 空指针问题分析

Spring Boot 1.5.9和嵌入式jetty服务器在运行时抛出空指针异常?

IBExpert 中的 Firebird 在访问某些存储过程时抛出错误

Thonny IDE 在启动时抛出 AssertionError

Swift 在尝试访问分段控制索引时抛出错误