试图调用[super didReceiveMemoryWarning]时崩溃

时间:2012-05-04 02:32:18

标签: objective-c ios memory-management sigsegv

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

以下是相关的跟踪信息:

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];
}

是的,我知道我不需要这样做。我计划删除这些代码(我甚至不知道为什么我仍然在那里),但我想确保我的问题来源已修复。我还没有在viewDidUnload中提出AttributesViewController。我还应该提到我正在使用ARC,但我不确定这是否重要。

根据我收到的反馈,使用相机时发生了内存警告(UIImagePickerController源类型为UIImagePickerControllerSourceTypeCamera)。 AttributesViewController由视图控制器以模式方式呈现,比呈现UIImagePickerController的视图控制器高两级,并且它们不共享任何对象或其他数据。我知道相机经常会引起内存警告,所以我不确定UIImagePickerController是否与其内存耗尽有关。{/ p>

我将Xcode设置为始终运行分析器,并且没有出现任何问题。我还通过Zombies and Leaks工具运行代码,但无法重现问题或发现任何其他问题。

1 个答案:

答案 0 :(得分:1)

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

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

更重要的是,您是否已确定收到这些内存警告的原因?当然,优雅地处理低内存情况是至关重要的,但如果人性化的话,防止它们就像(如果不是更重要的话)一样重要。您是否通过分析器运行代码(命令 + shift + B )?您是否已分析过您的应用程序(命令 + I )以识别任何泄漏源?

<强>更新

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

  1. 当您无法重现问题时,很难诊断(更不用说修复)了。这似乎是优先事项。如果您在iPhone 4或4S上进行测试,那么您将享受512MB DRAM,但3G只有256MB,而3只有128MB。您是否在较新的设备上进行测试,而用户可能会less capable devices?或者您的崩溃日志来自配备相当的设备?看起来你可能会在不同的时间获得didReceiveMemoryWarning,具体取决于设备配置,因此可能会更难以显示用户看到的崩溃。

  2. 为什么应用程序崩溃了?它可能源于didReceiveMemoryWarning无法为继续操作释放足够的内存(即后续alloc所需对象失败),但我不确定崩溃日志是否表明了这一点。该日志让我想知道您是否正在执行任何Key Value Observing或任何NSNotificationCenter逻辑?我问,因为你可以想象观察到的物体在没有移开观察者的情况下被释放出来的问题。我问这个因为我看到了addObserver:selector:name:object:引用,并且不知道Cocoa是否在后台做了什么,或者你的应用程序是否在做自己。 (它可能是无关的。)所有崩溃日志是否都显示类似的调用堆栈?

  3. 应用程序通常会检查以确保它的各种指针都是非零的吗?同样,我希望崩溃日志略有不同,但是在检查nil值时要特别小心,以确保purgeMemoryForReason没有在幕后发布一些内容,这似乎是谨慎的。< / p>

  4. 我想唯一的另一个建议是你的所有didReceiveMemoryWarning和viewDidUnload是否正在释放他们可以尽量减少内存警告的影响,确保应用程序能够在这种低内存情况下幸存下来。看起来标准didReceiveMemoryWarning将尝试卸载不活动的视图,因此您可能希望确保正确清理内存。根据{{​​3}},您需要确保在viewDidUnloaddidReceiveMemoryWarning中释放视图的对象。

  5. 对不起,我没有更多有建设性的建议。希望其他人能够通过一些更好的想法来实现。