我遇到了一个问题,即我的 iOS 应用程序在退出时崩溃,我已将其范围缩小到:
// File.h
struct Name {
NSString *name;
}
// File.mm
Name names[] = {
@"foo",
@"bar",
};
当应用程序退出(按下 iPad 上的主页按钮)时,我遇到了objc_msgSend
一个EXC_BAD_ACCESS (SIGSEGV)
. 它正在发生析构函数Name::~Name()
。
0 libobjc.A.dylib 0x37586e3a objc_release + 10
1 MyApp 0x0014abfc Name::~Name() (NameManager.h:21)
2 MyApp 0x0014ab42 Name::~Name() (NameManager.h:21)
3 MyApp 0x0014ad94 __cxx_global_array_dtor + 120
4 libsystem_c.dylib 0x36bba1cc __cxa_finalize + 216
5 libsystem_c.dylib 0x36b854f6 exit + 6
请记住,这是在一个 .mm 文件中,因此它被编译为 obj-c++。
这已经好几个月了。我不知道它是什么时候开始发生的,但我怀疑是我更新到 xcode 4.4 的时候。
NSString
文字应该受到保护(或一直受到保护)免受多个版本的影响,但我认为无论如何这里都不会发生这种情况。
有谁知道 xcode 4.4 中是否发生了一些变化?
我可以通过执行以下操作来修复崩溃:
struct Name {
__unsafe_unretained NSString *name;
}
但我讨厌在不理解为什么以前有效的方法不再有效的情况下这样做。或者也许它永远不应该奏效。我也担心内存被覆盖,所以这可能只是一个症状。
这发生在 DEBUG 和 RELEASE 中。
更新:我在 ~Name() 中放置了一个断点并验证内存没有损坏。LLDB 能够转储 NSString OK。但是当我踩到它时它崩溃了。