我的应用仅在未使用XCode调试器运行时崩溃。很难跟踪,因为我无法调试,但我终于想通了。这是因为在某些不属于我的对象上调用release。在我更正之前,我搜索并在此处找到了2个相关问题(链接如下)
iPhone crash only when device not connected to xcode, how to understand the crash log?
以上问题都没有回答为什么在通过调试器运行时没有崩溃。所以我的问题是它为什么会发生?我知道调试/发布特定崩溃的原因,但这很疯狂。它是偶然的,虽然它发生了10次以上。
答案 0 :(得分:2)
你所描述的并不是与内存相关的模糊错误的非典型。您可能还希望在此时使用debug-malloc。虽然不能保证找到一切。原因(并且可能只有源级调试器一直发生)是内存在可调试代码中至少有些不同,并且在调试器下运行时。因此,在调试器下,错误会导致不同的内存(无害)损坏。当不在调试器下时,损坏的位置实际上是您的代码所关心的内容,并且它会崩溃。
反过来可能会发生同样的情况,但你永远都不会知道 - 如果在运行debuggable时崩溃,你会在切换到在调试环境之外运行之前找到它。
答案 1 :(得分:1)
重申@ jyoung的答案,因为我第一次看到它时没有看到它:
尝试关闭Zombie Objects时运行。
在调试模式下,如果打开它,它将以不同方式处理内存分配。尝试不用运行它。
转到编辑方案...>运行>诊断。然后确保关闭僵尸对象:
然后再次运行您的代码路径。
答案 2 :(得分:0)
从[[NSBundle mainBundle] resourcePath]目录外部访问SQLite数据库时出现此问题,导致iCloud错误。
我发现错误只是在我的iPhone上安装了一个记录错误的控制台应用程序。
从正确的目录访问数据库后,错误消失,应用程序正确启动。
答案 3 :(得分:0)
当我创建一个NSString,从它发送一个UTF8String到另一个对象,并将它分配给一个char指针时,我遇到了这种症状。好吧,事实证明我忘了保留原来的NSString,这无论如何都不重要,因为我也没有意识到UTF8String方法(可能是一个允许访问指针本身的对象)在自动释放中运行池。也就是说,保留NSString本身并不能解决问题。
我认为只有因为我启用了僵尸才能在调试器下连接时才能正常工作,所以我的指针仍然有效。我应该看看这是否有效;如果是这样,这是使用和不启用NSZombie进行测试的一个很好的理由。
无论如何,这可能是糟糕的设计开始,一旦我找到它,一个非常明显的新手内存管理错误。幸运的是,Organizer窗口中的控制台给了我一些关于从哪里开始查看的提示,并且调试最终显示了我的指针值的变化。希望这有助于任何找到方法的人。
答案 4 :(得分:0)
我也遇到了这个问题,很幸运能够快速找出原因,希望通过在这里发布,我可以节省别人浪费的时间。为了澄清一下,我的应用程序在从XCode直接启动时没有任何问题,但在iPad上手动启动时会立即崩溃。
有问题的应用程序是用Obj-C编写的,但依赖于用Swift编写的一些第三方代码。 Swift代码作为嵌入式框架包含在应用程序中。我必须设置"嵌入式内容包含Swift Code"在应用程序的构建设置中为“是”(在“构建选项”下),问题就消失了。
答案 5 :(得分:0)
我在使用 Xcode Frameworks 进行模块化项目时遇到了同样的问题。即使删除了 AppDelegate 中的所有逻辑并且只在 application:didFinishLaunchingWithOptions
内返回 true,我仍然遇到崩溃。然后我切换到我的项目设置,在 Frameworks, Libraries, and Embedded Content
部分并更改了我添加到 Embed & Sign
的框架的嵌入选项。这就是为我解决问题的原因。我希望有人觉得这有帮助。