gpt4 book ai didi

objective-c - iOS App 在退出时崩溃

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:56 24 4
gpt4 key购买 nike

我遇到了一个问题,我的 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。但是当我踩到它时它崩溃了。

最佳答案

当您在 Objective-C++ 中声明一个包含打开 ARC 的 Objective-C 对象的“普通旧数据”struct 时,编译器有义务提供一个正确解除分配 ObjC 成员的析构函数结构,即使不是您自己编写的。

This restriction does not apply in Objective-C++. However, nontrivally ownership-qualified types are considered non-POD: in C++11 terms, they are not trivially default constructible, copy constructible, move constructible, copy assignable, move assignable, or destructible. It is a violation of C++’s One Definition Rule to use a class outside of ARC that, under ARC, would have a nontrivially ownership-qualified member.

当您声明该 Name 结构时,编译器会为您编写一个涉及隐式强持有 Objective-C 对象的析构函数。在执行时,这意味着 C++ 析构函数会删除它所期望的 C++ 结构,而是结束指向字符串的指针。由于周围没有有效的指针,-release ARC 在尝试取消引用不存在的接收器时尝试发送段错误。

当你声明一个 Objective-C 成员 __unsafe_unretained 时,它告诉 ARC 将它从它必须编写的析构函数中排除,因此结构被销毁,-release 永远不会发送。建议您将结构或类中的所有 Objective-C 对象标记为 __unsafe_unretained 并自行提供适当的内存管理,因为 ARC 会使跨语言的对象生命周期显着复杂化。

关于objective-c - iOS App 在退出时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926942/

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