-[CFString版本]:消息发送到已释放实例— Core Data iOS

实现是直接的。 我有一个实体“ MyApp”,有一个属性“ newName”。 在viewWillAppear中,我只是创建实体,为属性分配值,进行保存,最后进行访存。

在保存之前一切都很好。 但是,当我打印获取的结果时,事情发生了。 崩溃…。

这就是我所得到的。 没有控制台日志,没有警告,没有谋杀武器。

最初的线索是EXC_BAD_ACCESS和EXC_1386,表明它的存在,是的,ZOMBIE。 僵尸是保留计数为0的对象仍然继续存在。 要确认它在产品->编辑方案->诊断中启用了僵尸,请为Zombie对象启用复选标记。

再次运行该应用程序,我得到了日志。 由于字符串僵尸对象而导致崩溃的原因。

是时候找到僵尸了。

为了更深入地研究,我们需要侦探“ xcode工具”的帮助。 打开xcode->开发人员工具->工具-> 选择僵尸

在方案中选择所需的模拟器和应用,然后点击红色的录制按钮。

景气,我们弹出这个僵尸,

查看分配历史记录,我发现在获取之后,访问属性“ newName”会导致该属性的内存释放,

但为什么 ? 动机是什么?

过渡到ARC发行说明

描述如何将代码从手动保留/发行转换为使用ARC。

developer.apple.com

ARC对方法命名施加了约束:

  • 您不能给访问器一个以new开头的名称。

解决案例后,将核心数据实体的属性从“ newName”重命名为“ updatedName”,解决了崩溃问题。

希望这对您有帮助。 任何帮助都可以通过pratheesh_db@hotmail.com与我联系。