代码之家  ›  专栏  ›  技术社区  ›  Steven Fisher

如果我不再使用mkmapview,为什么在释放mkmapview之后我会崩溃?

  •  24
  • Steven Fisher  · 技术社区  · 15 年前

    我有一个 MKMapView . 有时在我的视图控制器被解雇后,我会得到一个 EXC_BAD_ACCESS .

    我打开 NSSZombies 看起来像是 MKMMAVIEW 我的视图控制器!尽管 MKMMAVIEW UIViewController 子类被释放。我已经检查过了,我的记忆管理是正确的。

    发生什么事?

    4 回复  |  直到 9 年前
        1
  •  44
  •   Steven Fisher    11 年前

    这是因为 MKMapView 作品。有一个操作挂起,所以mapkit将保留 MKMMAVIEW 而且它还没有真正被出售。这本身不是问题。问题是它仍在向您的代表发送消息。

    解决方法很简单:作为视图控制器清理的一部分,将映射视图的委托设置为 nil ,这将阻止 MKMMAVIEW 从发送信息到它。

    这记录在 MKMapViewDelegate Protocol Reference :

    在释放设置了委托的mkmapview对象之前,请记住将该对象的委托属性设置为nil。可以在dealloc方法中执行此操作,在该方法中可以释放映射视图。

    编辑:给奥斯卡一个支持票,就在下面,谁提供了文件引用这里。

    给定弧,我建议这意味着您应该将地图视图的委托设置为 在你的视图控制器的 dealloc .

        2
  •  18
  •   Dan J Akhil    12 年前

    好的,这是对答案的确认。这是苹果的文档,但mkmapview中没有。它只在其委托协议的文档中找到:

    在释放为其设置了 delegate,记住将objects delegate属性设置为nil。一 您可以在dealloc方法中执行此操作 地图视图。

    注意:这也适用于uiwebview。

    我在委托的dealloc方法中将mappview的委托指针设置为nil,我们的崩溃似乎已经消除了。

        3
  •  2
  •   Dan Marinescu    13 年前

    将地图视图的委托设置为 nil 不适合我。但是,设置 showsUserLocation=NO 通过确保没有接收到位置更新来处理委托。

        4
  •  0
  •   Luca Davanzo    9 年前

    问题是,在我的情况下,我第一次启动应用程序时,我不按“允许”时,提示位置授权(意外!!!)

    卸载并重新安装应用程序,当提示出现时,我允许授权,不再崩溃!