今天我有一个相当有趣的exc_bad_access崩溃。大量挖掘后,我想出了以下信息(在模拟器中运行):NSLogs如何导致代码不会崩溃?
如果我刚刚运行的代码时,应用程序将随机崩溃的同时,装载数据的随机点进我的管理对象。从我所知道的情况来看,当我将数据加载到托管对象时,它总是崩溃 - 而不是从我的JSON字典转换为数据到实际使用的对象(从字符串和NSNull到ints /浮点数和nils)的部分
随机崩溃当然是邪恶的,所以我试着在调试器中逐步完成整个过程,但这并不实际 - 我正在处理大量对象,所以逐个逐个地逐个处理它们只是没有工作。所以我决定添加一些NSLog来跟踪这个过程,并尝试用这种方式来发现一个模式。
立即解决了崩溃。
只要一个NSLog,在进程中的任何地方都可以防止崩溃。
我最终追踪了堆栈跟踪并发现了实际问题:我正在线程环境中访问管理对象,但不是从关联的MOC的performBlockAndWait:方法中访问。那时,这次事故对我来说非常明显 - 我很震惊,之前我没有更多的问题。我敢打赌,有一个“小”的测试数据2-3对象的集合,并与NSLogs有没有调试代码之间,错误是非常有效的早期掩盖......但问题依然存在:
为什么NSLog防止应用程序崩溃?一个没有副作用的代码怎么会改变其他应用程序的执行?这没有道理!
你使用的任何地方performSelector:方法和选择器,它不返回id类型作为参数吗?有时候NSLog可能会防止这些错误发生。在这种情况下需要使用NSInvocation – BergP 2013-04-10 19:03:50