分類
Swift

斯威夫特調試EXC_BAD_ACCESS中的AppDelegate

 

不少人在開發中都會遇到 EXC_BAD_ACCESS ,很遺憾,這一次 Xcode 不會給出任何詳細的解決方案。

通常來說,這是由於內存錯誤造成的。簡單來說就是你創建了對象 A,但在後來訪問的時候,內存裡 A 這塊區域已經被系統挪做他用了,比如放了對象 B 在這裡——你的 A 只剩下指針,實際內容已經不存在了。

這時就會出現類似這樣的崩潰:

由于实际对象已经变更Swift 编译器却并不知道结果自然就是一个“未知的 Selector”了

尝试解决它

一开始无知的我想要去找到这个“instance”到底是谁于是我开始用这个方法打印程序里的对象

嗯,后来我发现这是一个无止境的工作……但报错变得有意思了

这让我更加摸不着头脑

再後來,干脆就没报错了,就是 EXC_BAD_ACCESS于是内存地址对比也就到此为止了……

正确的做法

總之,Xcode 还是有工具来处理这种情况的——虽然不一定是百发百中但至少能增加一点排错的线索我们到 Xcode 左上角选择 Edit Scheme编辑当前程序的执行选项

选择 Edit Scheme... 来编辑运行参数
选择 Edit Scheme来编辑运行参数

在打开的页面选“Run”选右侧“Diagnosis”选项卡勾选下方的“Zombie Object”

开启 Zombie Object 模式

Zombie Object 模式僵尸模式在这个模式下你的程序不会真的释放需要被释放的内存即使对象 A 已经没有引用它也会被保留在内存当中这样就避免了系统将其他对象的内存写到同一位置一旦 EXC_BAD_ACCESS 发生Xcode 将能够发现程序原本想要访问的是哪个对象

再次运行程序触发崩溃我们得到了新的报错

顯然,这次就明确多了虽然不知为何但这次的 EXC_BAD_ACCESS 是由于程序访问了一个 NSSpellChecker 对象导致的这下就大大缩小了排错范围运气好的话应该很快就能定位问题所在了

總之,最终记得关闭这个模式不然程序占用内存会无休止地增加下去……

參考文獻

本文由 落格博客 原創撰寫:落格博客 » 斯威夫特調試EXC_BAD_ACCESS中的AppDelegate

轉載請保留出處和原文鏈接:https://www.logcg.com/archives/3313.html

通過 落格博客

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

發表評論

您的電子郵件地址不會被公開. 必填字段標 *