iPhone 编程:使用 MKMapView 的奇怪错误
Posted
技术标签:
【中文标题】iPhone 编程:使用 MKMapView 的奇怪错误【英文标题】:iPhone programming : weird error using a MKMapView 【发布时间】:2011-03-15 21:23:20 【问题描述】:我正在开发一个 iPhone 应用程序,有时在操作地图时会收到这个奇怪的日志:
ImageIO_Free: ptr 0xdf0f000 got double released??? (16384 bytes)
如果我继续玩下去,应用程序就会崩溃。 我用谷歌搜索了它,但没有发现任何有趣的东西......太奇怪了!
【问题讨论】:
【参考方案1】:Apple 开发者论坛上有一个帖子更能说明这一点:“Map kit related crash?”
回复帖子的人有更详细的诊断信息,它表明崩溃发生在一个单独的线程中,但他没有产生任何可能导致他遇到的行为/崩溃的线程。
你应该file a bug with Apple。
【讨论】:
【参考方案2】:如果没有我的水晶球,我只能猜测,但您可能会手动将 release
d 标记为 autorelease
的东西。
阅读Memory Management Programming Guide,尤其是Memory Management Rules!两次。
【讨论】:
嗯,这是我首先想到的事情之一。我已经检查了我的代码两次,没有重复发布......奇怪的是它只是不时发生。我在地图上也有一些 MKPinAnnotationView 对象。 它只是间歇性地发生可能意味着存在赛车状况。无论如何,你的错误信息告诉我们有一个双重版本,你没有给我们更多的工作。你期待什么? 是的,我知道,但是即使使用简单的 MKMapView 视图而没有其他任何东西,也会出现问题。我尝试通过创建一个带有关联 .XIB 的新文件,添加一个 MKMapView,玩弄地图并得到同样的错误。所以我想知道这是否是与框架相关的问题,是否其他人也遇到过同样的问题。 您的建议似乎为我解决了这个问题。我有一个 CLLocation,我曾经在缩放到它后立即释放它。一旦我注释掉 [currentLocation release] 语句,它就停止使用 ^^ 抛出 EXC_BAD_ACCESS 消息。【参考方案3】:这很可能是一个警告,即同一个对象向 ImageIO_Free 对象发送的版本比它发送的显式或隐式保留多一个版本。 ImageIO_Free 被过度释放,随后意外死亡,导致崩溃。
【讨论】:
【参考方案4】:我也随机遇到这个问题...
ImageIO_Free: ptr 0xd700000 被双重释放??? (16384 字节)散列:0
不知道如何解决。好像是框架的问题。
【讨论】:
【参考方案5】:这只是发生在我身上,我相信我有答案。
问题似乎在于向地图视图添加注释。似乎当您在 MKMapView 实例上调用“addAnnotations”时,MKMapView 对象不会保留这些对象。因此,在您使用地图并将注释移入和移出视图之后,当需要重新渲染注释时,内存已被释放,您会收到 EXC_BAD_ACCESS 错误。
要解决这个问题,只需保留要添加为注释的对象。这可以通过使用映射当前注释的 NSMutableArray 实例变量来完成。每次调用 addAnnotations 时,也将这些对象添加到此保留数组中,您应该已准备就绪。
在您的 .h 文件中:
@interface MapViewController : TTModelViewController <MKMapViewDelegate, UIAlertViewDelegate>
NSMutableArray *feeds;
@property (nonatomic, retain) NSMutableArray *feeds;
在您的 .m 文件中:
@synthesize feeds;
// (release feeds in your dealloc)
当您添加注释时,请执行以下操作:
if (self.feeds == nil)
self.feeds = [NSMutableArray array];
[self.feeds addObjectsFromArray:newPois]; // newPois is an array of annotations
[mapView addAnnotations:newPois];
到目前为止为我工作。如果情况发生变化,将更新。如果您从地图视图中删除对象,您可能还希望保持此提要数组同步,以避免“死内存”。
【讨论】:
以上是关于iPhone 编程:使用 MKMapView 的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章