【问题标题】:ALAsset pointer throw EXC_BAD_ACCESS when access itALAsset 指针在访问时抛出 EXC_BAD_ACCESS
【发布时间】: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 稍后它会产生内存压力。
  • 我只是在我的第一篇文章中添加了回溯

标签: ios iphone objective-c alassetslibrary alasset


【解决方案1】:

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

这里是示例代码:MyImagePicker

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

【讨论】:

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