gpt4 book ai didi

ios - NSLogs 如何使代码不崩溃?

转载 作者:技术小花猫 更新时间:2023-10-29 11:01:08 25 4
gpt4 key购买 nike

我今天遇到了一个相当有趣的 exc_bad_access 崩溃。经过大量挖掘,我得出了以下信息(在模拟器中运行):

如果我只是运行代码,应用程序会在将数据加载到我的托管对象时随机崩溃。据我所知,当我将数据加载到托管对象时它总是崩溃——而不是在从我的 JSON dict 转换为数据到实际使用的对象的部分(从字符串和 NSNulls 到 ints/floats 和 nils)

当然,随机崩溃是有害的,所以我尝试在调试器中逐步完成整个过程,但事实证明这并不实用——我正在处理很多对象,所以一个接一个地逐步完成它们只是没有用。所以我决定添加一些 NSLogs 来跟踪流程并尝试以这种方式发现模式。

立即解决了崩溃。

进程中任何位置的一个 NSLog 都可以防止崩溃。

我最终追踪了堆栈跟踪并发现了实际问题:我在线程环境中访问托管对象,但不是从关联的 MOC 的 performBlockAndWait: 方法中访问。那时,崩溃对我来说非常明显——我很震惊我之前没有遇到更多问题。我愿意打赌,在拥有 2-3 个对象的“小”测试数据集和使用 NSLogs 调试代码之间,错误在早些时候被有效地掩盖了……但问题仍然存在:

为什么 NSLog 可以防止应用程序崩溃?一段没有副作用的代码究竟如何改变应用程序其余部分的执行?这毫无意义!

最佳答案

令人惊讶的是,这是一种相当普遍的情况:我不止一次看到在看似无关的地方启用日志记录会立即解决其他地方的计时问题。

原因是 NSLog 与许多其他输出函数一样,具有内部同步。在某处有一个互斥锁可以保护对 NSLog 内部缓冲区的访问,无论是在 NSLog 本身还是在它使用的 I/O 库之一中。这种同步使调用者能够从多个线程使用 NSLog。正是这种同步改变了程序的时间,影响了竞争条件并最终解决了崩溃问题。

关于ios - NSLogs 如何使代码不崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com