Tag: 僵尸

Xcode Instruments —僵尸

在保存之前一切都很好。 但是,当我打印获取的结果时,事情发生了。 崩溃…。 这就是我所得到的。 没有控制台日志,没有警告,没有谋杀武器。 最初的线索是EXC_BAD_ACCESS和EXC_1386,表明它的存在,是的,ZOMBIE。 僵尸是保留计数为0的对象仍然继续存在。 要确认它在产品->编辑方案->诊断中启用了僵尸,请为Zombie对象启用复选标记。 再次运行该应用程序,我得到了日志。 由于字符串僵尸对象而导致崩溃的原因。 是时候找到僵尸了。 为了更深入地研究,我们需要侦探“ xcode工具”的帮助。 打开xcode->开发人员工具->工具-> 选择僵尸 在方案中选择所需的模拟器和应用,然后点击红色的录制按钮。 景气,我们弹出这个僵尸, 查看分配历史记录,我发现在获取之后,访问属性“ newName”会导致该属性的内存释放, 但为什么 ? 动机是什么? 过渡到ARC发行说明 描述如何将代码从手动保留/发行转换为使用ARC。 developer.apple.com ARC对方法命名施加了约束: 您不能给访问器一个以new开头的名称。 解决案例后,将核心数据实体的属性从“ newName”重命名为“ updatedName”,解决了崩溃问题。 希望这对您有帮助。 任何帮助都可以通过pratheesh_db@hotmail.com与我联系。

僵尸和编码器

僵尸! 是! 谁说僵尸不是真实的,如果您是iOS开发人员,您会非常了解它们。 没有? 别担心,让我们来探索一下。 在某个时间点,我们在不知不觉中或有意将它们植入我们的代码中,而更糟糕的情况是我们想要杀死它们。 僵尸不过是一半死亡,一半释放或保留的物体。 在本文中,我们不仅会跟踪它们,而且会以一种更简化的方式进行处理。 您是否曾经在跟踪已释放对象时遇到麻烦? 您是否曾经遇到过崩溃,内容是“发送到已释放实例的消息”? 真正!!! 然后,本文适合您,让我们开始吧。 有时,二进制语言会给我们带来沉重打击。 您能从这个“ 0x10010d681 ”中猜出类名吗? 也许不是。 假设这是一个已释放的对象,现在难度级别将更加困难。 尽管Xcode为我们提供了一个很好的工具来理解和跟踪“ Instruments” 。 在拥有大量分析模板的地方,Instruments是一个很好的工具。 从“ 分配 ”到“ 泄漏 ”再到“ 僵尸 ”。 但是今天,我们将不再探索Instrument,而是采用一种更为简单的方式来追踪僵尸对象的内存历史记录。 知道答案总是更好,无论答案是什么 因此,首先我们将编辑项目的方案: 在“诊断”下,我们有各种“内存管理”选项。 选择“僵尸对象”,然后为“日志记录”选择“ Malloc堆栈”。 就是这样,我们已经准备好运行该项目。 现在,当我们遇到可能由僵尸实例引起的崩溃时,这就是我们要通过在xcode的控制台中输入以下命令来调试它的方法: a)(lldb)命令脚本导入lldb.macosx.heap 这将产生类似于以下结果:

-[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与我联系。