Ios 这是内存崩溃吗?NSZombies不';我没赶上

Ios 这是内存崩溃吗?NSZombies不';我没赶上,ios,memory,Ios,Memory,这肯定是内存崩溃,还是我应该寻找其他东西 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x81093cd0 Crashed Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libobjc.A.dylib 0x33563

这肯定是内存崩溃,还是我应该寻找其他东西

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x81093cd0
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x33563f78 objc_msgSend + 16
1   Foundation                      0x34d6b92c __NSFireDelayedPerform + 408
2   CoreFoundation                  0x35919a2c __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
3   CoreFoundation                  0x35919692 __CFRunLoopDoTimer + 358
4   CoreFoundation                  0x35918268 __CFRunLoopRun + 1200
5   CoreFoundation                  0x3589b49e CFRunLoopRunSpecific + 294
6   CoreFoundation                  0x3589b366 CFRunLoopRunInMode + 98
7   GraphicsServices                0x33636432 GSEventRunModal + 130
8   UIKit                           0x33073cce UIApplicationMain + 1074
使用探查器,活动字节在任何时候都小于10MB,当内存出现警告时,我返回到3MB或更低

此语句返回YES,因此我假设已启用僵尸:

getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")
当我从Xcode运行时,应用程序会在Xcode没有意识到的情况下崩溃(在一些任意数量的内存警告之后)


除了“在启用NSZombies的情况下运行”之外,还有什么建议吗?这肯定是内存崩溃吗?

是的,这是内存相关错误(分段错误)。请记住,
NSZombies
无法捕获所有内存错误。

是的,这是一个与内存相关的错误(分段错误)。请记住,
NSZombies
无法捕获所有内存错误。

SIGSEGV发生在代码尝试访问“不存在”的内存时(即,您尝试使用的地址在虚拟地址空间中没有映射)

造成这种情况的确切原因可能有很多,最常见的是:

  • 使用未(正确)初始化的指针
  • 从数组的末尾走出来
  • 使用已释放的内存

请注意,以上所有内容都是“未定义行为”的示例,因此您可能会遇到代码没有崩溃的情况,尽管它做了一些错误的事情,但在其他情况下,相同的代码确实会出错

当代码试图访问“不存在”的内存时(即,您试图使用的地址在虚拟地址空间中没有映射),就会发生SIGSEGV

造成这种情况的确切原因可能有很多,最常见的是:

  • 使用未(正确)初始化的指针
  • 从数组的末尾走出来
  • 使用已释放的内存


请注意,以上所有内容都是“未定义行为”的示例,因此您可能会遇到代码没有崩溃的情况,尽管它做了一些错误的事情,但在其他情况下,相同的代码确实会出错

在“断点”选项卡上,单击左下角的+图标,添加一个异常断点,然后运行应用程序并查看其停止位置。已完成,断点已启用。谢谢。你知道应用程序什么时候崩溃吗?例如,如果您在从视图控制器返回时发生崩溃(即取消分配),您可能需要检查其dealloc方法的双重释放。你能提供更多的细节吗?我会尽量确定它发生的时间。到目前为止,它似乎是随机的,但我将尝试验证它。@yununedimmehel答案是“它是随机的”。此外,我的代码都在ARC下。。。。嗯。仍在调查中。在“断点”选项卡上,单击左下角的+图标,添加一个异常断点,然后运行应用程序并查看其停止位置。已完成,断点已启用。谢谢。你知道应用程序什么时候崩溃吗?例如,如果您在从视图控制器返回时发生崩溃(即取消分配),您可能需要检查其dealloc方法的双重释放。你能提供更多的细节吗?我会尽量确定它发生的时间。到目前为止,它似乎是随机的,但我将尝试验证它。@yununedimmehel答案是“它是随机的”。此外,我的代码都在ARC下。。。。嗯。还在调查。当你说“记忆相关”时,唯一的可能是我使用了太多的记忆,对吗?而我已经返回的内存(不以活动字节显示)可能不是问题,对吗?实际上,坏访问崩溃通常指的是被释放的东西,然后你试图访问它somehow@Yar不。这通常意味着您正在解除对无效指针的引用(请参阅Ismael的评论)。谢谢。这真的很有帮助。我开始怀疑这是我为回应内存警告所做的出色工作的一部分,这也解释了为什么iPad 2上从未出现过内存警告(因为没有内存警告)。。。好吧,我再深入一点。感谢您的回答和对话,非常感谢。正如我在对另一个答案的评论中所说的,我现在认为问题的一部分是在应用程序生命周期之外的任何对象上使用
UIApplicationIDReceiveMemoryWarningNotification
。我在dealloc中转储了通知,但那可能太晚了。不幸的是,这很难证明。当你说“记忆相关”时,唯一的可能是我使用了太多的记忆,对吗?而我已经返回的内存(不以活动字节显示)可能不是问题,对吗?实际上,坏访问崩溃通常指的是被释放的东西,然后你试图访问它somehow@Yar不。这通常意味着您正在解除对无效指针的引用(请参阅Ismael的评论)。谢谢。这真的很有帮助。我开始怀疑这是我为回应内存警告所做的出色工作的一部分,这也解释了为什么iPad 2上从未出现过内存警告(因为没有内存警告)。。。好吧,我再深入一点。感谢您的回答和对话,非常感谢。正如我在对另一个答案的评论中所说的,我现在认为问题的一部分是在应用程序生命周期之外的任何对象上使用
UIApplicationIDReceiveMemoryWarningNotification
。我在dealloc中转储了通知,但那可能太晚了。不幸的是,这很难证明/演示。我还想指出,如果有“正确”的缺点,您很容易在一些未编写的代码中导致崩溃。例如,如果覆盖已分配区域的结尾,内存分配和释放功能通常会崩溃。或者如果你释放了一些不是你在第一次分配时得到的指针的东西,但是如果我不是usi,最后一种情况是不可能的