Objective c 尝试呼叫[super didReceiveMemoryWarning]时崩溃

Objective c 尝试呼叫[super didReceiveMemoryWarning]时崩溃,objective-c,ios,memory-management,segmentation-fault,Objective C,Ios,Memory Management,Segmentation Fault,我有一个应用程序,我收集了一些无法复制的崩溃报告。我有一个视图控制器,它在处理自己的内存警告时只需调用[super didReceiveMemoryWarning](是的,我知道我不需要这样做,但这也不能解决我现在遇到的问题)。一旦父UIViewController尝试调用PurgeMemory,原因是它与 以下是相关的跟踪信息: Exception Type: SIGSEGV Exception Codes: SEGV_ACCERR at 0x90000008 Crashed Thread:

我有一个应用程序,我收集了一些无法复制的崩溃报告。我有一个视图控制器,它在处理自己的内存警告时只需调用
[super didReceiveMemoryWarning]
(是的,我知道我不需要这样做,但这也不能解决我现在遇到的问题)。一旦父UIViewController尝试调用PurgeMemory,原因是它与

以下是相关的跟踪信息:

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0x90000008
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x361dbf78 objc_msgSend + 16
1   UIKit                               0x31fbf499 -[UIViewController purgeMemoryForReason:] + 65
2   MyApp                               0x00016f0d -[AttributesViewController didReceiveMemoryWarning] (AttributesViewController.m:76)
3   Foundation                          0x30c5b4ff __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 19
4   CoreFoundation                      0x34d86547 ___CFXNotificationPost_block_invoke_0 + 71
5   CoreFoundation                      0x34d12097 _CFXNotificationPost + 1407
6   Foundation                          0x30bcf3eb -[NSNotificationCenter postNotificationName:object:userInfo:] + 67
7   Foundation                          0x30bd0c1b -[NSNotificationCenter postNotificationName:object:] + 31
8   UIKit                               0x31f8a271 -[UIApplication _performMemoryWarning] + 81
9   UIKit                               0x31f8a36b -[UIApplication _receivedMemoryNotification] + 175
10  libdispatch.dylib                   0x30de42e1 _dispatch_source_invoke + 517
11  libdispatch.dylib                   0x30de1b81 _dispatch_queue_invoke$VARIANT$mp + 53
12  libdispatch.dylib                   0x30de1ec1 _dispatch_main_queue_callback_4CF$VARIANT$mp + 157
13  CoreFoundation                      0x34d8d2ad __CFRunLoopRun + 1269
14  CoreFoundation                      0x34d104a5 CFRunLoopRunSpecific + 301
15  CoreFoundation                      0x34d1036d CFRunLoopRunInMode + 105
16  GraphicsServices                    0x3600c439 GSEventRunModal + 137
17  UIKit                               0x31e06e7d UIApplicationMain + 1081
18  MyApp                               0x0000243b main (main.m:15)
我希望我能重现这个错误,但无论我在测试设备或模拟器上触发了多少次内存警告,我都不能让它发生。对于我可能寻找的任何帮助,我都将不胜感激,因为我已经尝试寻找,但没有发现任何指向潜在问题的信息。谢谢

编辑:正如我所说的,我没有在《didReceiveMemoryWarning》中做任何事情:

- (void) didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
是的,我知道我不需要这样做。我计划删除这段代码(我甚至不知道为什么我还在那里),但我想确保我的问题源已经修复。我还没有在
AttributesViewController
中实现
viewDidUnload
。我还应该提到我使用的是ARC,但我不确定这在这里是否重要

根据我收到的反馈,使用相机时会出现内存警告(
UIImagePickerController
with source type
UIImagePickerController源类型相机
AttributesViewController
由视图控制器在显示
UIImagePickerController
的视图控制器上以两级模式显示,并且它们不共享任何对象或其他数据。我知道摄像头经常导致内存警告,所以我不确定它是否与
UIImagePickerController
有任何关系,除了它是内存占用器这一事实


我已经将Xcode设置为始终运行分析器,这并没有出现任何问题。我还通过僵尸和泄漏工具运行了代码,但无法重现问题或发现任何其他问题。

你在didReceiveMemoryWarning中做什么?你在释放记忆吗?关闭视图?什么?邮政编码![我看到你发布了更多的代码。谢谢。]

否则,导致didReceiveMemoryWarning的问题将无法解决,因此,今后分配更多内存的尝试(即alloc new objects)可能会开始失败。因此,依赖于这些对象的任何代码都将失败。您的代码是否实际检查了所有您分配新内容的时间的返回值

更重要的是,您是否确定了接收这些内存警告的原因?当然,优雅地处理内存不足的情况是至关重要的,但如果人力资源允许的话,防止内存不足也同样重要(如果不是更重要的话)。您是否已通过分析器运行代码(command+shift+B)?您是否分析了您的应用程序(command+I)以确定任何泄漏源

更新:

感谢分享您的澄清。坦率地说,我的想法越来越少,但还有一些想法:

  • 当您无法重现问题时,很难进行诊断(更不用说修复了)。这似乎是当务之急。如果你在iPhone4或4S上测试,你可以享受512MB的DRAM,但3G只有256MB,而3只有128MB。您是否在更新的设备上进行测试,而用户可能有?或者,您的故障日志是否来自装备类似的设备?根据设备配置的不同,您可能会在不同的时间收到didReceiveMemoryWarning,因此可能更难显示用户看到的崩溃

  • 为什么应用程序会崩溃?这可能源于
    didReceiveMemoryWarning
    无法释放足够的内存以继续操作(即所需对象的后续
    alloc
    s失败),但我不确定崩溃日志是否指示了这一点。日志让我想知道你是否在做任何或任何逻辑?我这样问是因为你可以想象一个被观察到的物体在没有移除观察者的情况下被释放所产生的问题。我这样问是因为我看到了
    addObserver:selector:name:object:
    引用,不知道Cocoa是在后台做的,还是你的应用程序自己做的。(这可能是不相关的。)所有崩溃日志都显示了类似的调用堆栈吗

  • 应用程序是否通常检查以确保其各种指针均为非零?同样,我希望崩溃日志会略有不同,但在检查nil值时要格外谨慎,以确保
    purgemoryforreason
    不会在幕后发布某些内容

  • 我想唯一的另一个建议是,你们所有的didReceiveMemoryWarning和viewDidUnload是否都在尽其所能地释放内存警告,以最小化内存警告的影响,确保应用程序在内存不足的情况下生存。看起来标准版将尝试卸载未激活的视图,因此您可能希望确保这些视图正确清理内存。根据,您希望确保在
    viewDidUnload
    direceivememorywarning
    中释放视图的对象


  • 对不起,我没有更具建设性的建议。希望其他人能想出一些更好的主意。

    你试过启用僵尸吗?我在帖子中添加了更多细节。我也相应地修改了我的答案,但我的想法已经没有了。谢谢你的反馈。我将采纳这些建议,仔细检查我的代码,看看是否可以找到我还没有看到的任何内容。我确实发现在视图控制器上有一个保留视图,我在
    viewDidUnload
    中没有将其设置为nil。因为我找到了这个,我还找到了其他一些我需要做这个的地方。我花了两周的时间来解决这个问题