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.dylib
objc_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 作业时抛出空指针异常
Spring Boot 1.5.9和嵌入式jetty服务器在运行时抛出空指针异常?
IBExpert 中的 Firebird 在访问某些存储过程时抛出错误