MKMapView 在其超级视图被解除分配后仍然向委托发送消息

2024-02-10

编辑:更改了标题。我当时不知道,但这是重复的如果我不再使用 MKMapView,为什么在释放它后我会崩溃? https://stackoverflow.com/questions/2188098/why-am-i-crashing-after-mkmapview-is-freed-if-im-no-longer-using-it


这个问题类似于为什么使用 ARC + NSZombieEnabled 时对象未释放 https://stackoverflow.com/questions/8408071/why-is-object-not-dealloced-when-using-arc-nszombieenabled但足够不同,我认为值得把它扔在那里,以防有人理解并向我解释正在发生的事情。另一个问题可能是 XCode bug,所以我认为这可能是类似的。

设想:

  1. RootViewController has a tableView显示一堆项目
  2. 选择一个单元格会呈现一个模式detailViewController包含另一个tableView
  3. 中的表格单元格之一detailViewController包含一个MKMapView显示该项目的位置
  4. mapView.delegate = detailViewController
  5. 关闭模式detailViewController

此后不久,应用程序崩溃了MKMapView sends mapView:viewForAnnotation:到现在已释放的detailViewController。此崩溃在具有临时发行版本的用户设备上重现,因此该问题与NSZombieEnabled.

我能够通过添加以下内容来解决崩溃问题:

_mapView.delegate = nil;

to the dealloc的方法tableViewCell包含地图视图。

问题:为什么在释放单元格时需要将委托清零?似乎是mapView当单元被解除分配时,应该由 ARC 解除分配,而无需这样做。零代表是一个很好的做法,但我认为在这种情况下不需要这样做。

编辑:两者的所有子视图detailViewControllerUITableViewCells被声明为(nonatomic, strong)属性阿拉:

@property (nonatomic, strong)   MKMapView *         mapView;

编辑2:我想我需要更好地阅读文档。 @fluchtpunkt 是正确的。以下是来自的相关信息MKMapView文档:

在释放已设置了 MKMapView 对象之前 delegate,记住将该对象的 delegate 属性设置为 nil。一 您可以执行此操作的地方是在您处置的 dealloc 方法中 地图视图。


MKMapView 不是用 ARC 编译的,因此该属性delegate仍然被声明为assign代替weak.
来自MKMapView 文档 http://developer.apple.com/library/ios/documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/occ/instp/MKMapView/delegate:

@property(nonatomic, assign) id<MKMapViewDelegate> delegate

并从过渡到 ARC 发行说明 http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html:

如果您需要管理资源而不是释放实例变量,您可以实现 dealloc 方法。您不必(实际上不能)释放实例变量,但是您可能需要在系统类上调用 [systemClassInstance setDelegate:nil]以及其他未使用 ARC 编译的代码。


对于系统类(NS*、UI*)的委托,您必须使用“旧”规则,在释放委托对象时将委托设置为 nil。

所以添加一个 dealloc 方法到你的detailViewController

- (void)dealloc {
    self.mapView.delegate = nil;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MKMapView 在其超级视图被解除分配后仍然向委托发送消息 的相关文章

随机推荐

  • Power Bi 中具有多轴的重叠条形图

    我想在 PowerBi 中有一个具有多个轴的重叠条形图 我有一个来自 Excel 的示例 如果可能的话 我希望在 PowerBi 中重新创建该示例 这里是例子 这在 PowerBi 中可能吗 也许通过使用我不知道的自定义视觉效果 提前致谢
  • AudioPlayer iOS 和 m4a

    我制作了一个使用 AVAudioPlayer 播放音乐的应用程序 它上传或下载歌曲 将它们写入核心数据 然后在选择时调用它们来播放 我测试过的所有 15 首歌曲都可以在 iPhone 音乐客户端和我自己的电脑上正常运行 但是 其中三个无法在
  • 动态复选框创建

    我想在我的 Android 应用程序运行时动态创建一组复选框 当应用程序运行时 除了按钮之外什么都不显示 我忘记了什么 提前致谢 public class DataNotificationSurvey extends Activity pr
  • 使用 PHP 在 CSV 文件中用双引号将每个字段括起来?

    我需要使用 PHP 将所有带有双引号的字符串和数字放入 CSV 文件中 如何从 PHP 创建 CSV 文件 并将所有数据放在双引号内 我正在使用此代码生成 CSV 我正在使用 codeigniter 框架 array array array
  • jQuery 切换 Cookie 支持

    我正在尝试将 jQuery Cookie 插件实现到我的幻灯片切换脚本中 但到目前为止尚未成功 这是我的代码 没有任何 cookie 实现 jQuery document ready function a toggle click func
  • Eclipse 缩进指南

    我正在尝试从以下网页安装 eclipse 的缩进指南插件 http sschaef github io IndentGuide http sschaef github io IndentGuide 我之前没有在 eclipse 中安装过插件
  • 进行机器间锁定有哪些好方法?

    我们的服务器集群由 20 台机器组成 每台机器有 10 个 5 个线程的 pid 我们想要某种方法来防止任何机器上任何 pid 中的任何两个线程同时修改同一个对象 我们的代码是用 Python 编写的并在 Linux 上运行 如果这有助于缩
  • 当应用程序在 WP 8.1 商店应用程序中恢复时,应用程序恢复事件不会触发

    我的 WP 8 1 商店应用程序的行为非常奇怪 当我快速离开然后返回时 应用程序恢复事件会按预期触发 但是 如果我将应用程序保留在后台一段时间 然后返回时 应用程序将触发 Constructor 和 OnNavigateTo 事件而不是 R
  • 检查 Rust 中的整数溢出[重复]

    这个问题在这里已经有答案了 Rust 有没有一种规范的方法来显式检查整数溢出 我用谷歌搜索但找不到答案 就像是 match add or overflow x y None gt println overflow Some z gt pri
  • 如何子类化 UILabel、UIButton 等 UI 元素

    我正在子类化UILabel in a CustomLabel class 当我尝试使用简单的方法时遇到问题UILabel我希望将来对其他元素进行子类化 我读到我可以创建一个category of UILabel 这东西哪一个比较好呢 类别还
  • Ansible Galaxy 角色安装到特定目录?

    所以我想我应该尽可能开始使用 Ansible Galaxy 而不是编写自己的角色 我刚刚安装了我的第一个角色 它被安装到 etc local ansible roles 我在 OSX 上 现在我想知道你如何在我真正需要的地方安装这个角色 我
  • Visual Studio 2012 附带哪个版本的 Dinkumware STL Lib?

    在早期版本的 Visual Studio 中 有一个预定义的宏 CPPLIB VER 它报告此版本 VS 附带的 Dinkumware STL 库的版本 截至 2012 年 我无法找到或使用这个宏 它未定义 并且我无法在网上找到有关此事的任
  • Sitecore 中的常规链接

    我是 Sitecore 的新手 我创建了一个页面模板 并为 常规链接 类型的 URL 添加了一个字段 我为链接文本创建了另一个字段 这是该项目中的标准做法 我只是想在我的用户控件中显示链接 但我无法让它工作 这应该很简单 但我在兜圈子 这是
  • 非焦点窗体上的 C#/WPF 热键(如 launchy)

    Is it possible to catch a hotkey eg Ctrl Space from a not focused form to make it appear whenever someone uses this spec
  • 我可以在 Fortran 中使用可分配数组作为意图(输出)矩阵吗?

    考虑以下子例程 subroutine myProc m n flag X Integer intent in m n logical intent in flag real 8 intent out allocatable X if fla
  • 在我的 Pixel Shader(UWP、Win2D)中支持多种颜色输入

    我一直在开发一款可以提供颜色替换的应用程序 并且在解决方案上从 Jet Chopper 获得了很多帮助 他为我提供了以下代码 该代码本质上使用 ControlSpectrum 控件来控制源颜色和目标颜色 这个想法是您指定一个源颜色 然后将其
  • 使用 JQuery Ajax Post 调用渲染简单的 ASP.NET MVC PartialView

    我的 MVC 控制器中有以下代码 HttpPost public PartialViewResult GetPartialDiv int id drop down value PartyInvites Models GuestRespons
  • 如何开始使用 Akka Streams? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Akka Streams 库已经提供了相当多的丰富的文档 http doc akka io docs akka 2 4 2 RC1 s
  • SPSS - 合并具有 ID 变量重复案例和新案例/变量的文件

    我有一个多年来商店访问的管理数据集 我正在尝试将其合并到ID多变的 每个数据集都有一个重复项ID发生在不同的商店访问期间 注释为Date 一些较新的数据文件也有新变量 Y 不包含在旧数据文件中 不同年份的数据集也会包含不同的案例 由不同的案
  • MKMapView 在其超级视图被解除分配后仍然向委托发送消息

    编辑 更改了标题 我当时不知道 但这是重复的如果我不再使用 MKMapView 为什么在释放它后我会崩溃 https stackoverflow com questions 2188098 why am i crashing after m