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 typeUIImagePickerController源类型相机
)AttributesViewController
由视图控制器在显示UIImagePickerController
的视图控制器上以两级模式显示,并且它们不共享任何对象或其他数据。我知道摄像头经常导致内存警告,所以我不确定它是否与UIImagePickerController
有任何关系,除了它是内存占用器这一事实
我已经将Xcode设置为始终运行分析器,这并没有出现任何问题。我还通过僵尸和泄漏工具运行了代码,但无法重现问题或发现任何其他问题。你在didReceiveMemoryWarning中做什么?你在释放记忆吗?关闭视图?什么?邮政编码![我看到你发布了更多的代码。谢谢。] 否则,导致didReceiveMemoryWarning的问题将无法解决,因此,今后分配更多内存的尝试(即alloc new objects)可能会开始失败。因此,依赖于这些对象的任何代码都将失败。您的代码是否实际检查了所有您分配新内容的时间的返回值 更重要的是,您是否确定了接收这些内存警告的原因?当然,优雅地处理内存不足的情况是至关重要的,但如果人力资源允许的话,防止内存不足也同样重要(如果不是更重要的话)。您是否已通过分析器运行代码(command+shift+B)?您是否分析了您的应用程序(command+I)以确定任何泄漏源 更新: 感谢分享您的澄清。坦率地说,我的想法越来越少,但还有一些想法:
didReceiveMemoryWarning
无法释放足够的内存以继续操作(即所需对象的后续alloc
s失败),但我不确定崩溃日志是否指示了这一点。日志让我想知道你是否在做任何或任何逻辑?我这样问是因为你可以想象一个被观察到的物体在没有移除观察者的情况下被释放所产生的问题。我这样问是因为我看到了addObserver:selector:name:object:
引用,不知道Cocoa是在后台做的,还是你的应用程序自己做的。(这可能是不相关的。)所有崩溃日志都显示了类似的调用堆栈吗purgemoryforreason
不会在幕后发布某些内容viewDidUnload
或direceivememorywarning
中释放视图的对象对不起,我没有更具建设性的建议。希望其他人能想出一些更好的主意。你试过启用僵尸吗?我在帖子中添加了更多细节。我也相应地修改了我的答案,但我的想法已经没有了。谢谢你的反馈。我将采纳这些建议,仔细检查我的代码,看看是否可以找到我还没有看到的任何内容。我确实发现在视图控制器上有一个保留视图,我在
viewDidUnload
中没有将其设置为nil。因为我找到了这个,我还找到了其他一些我需要做这个的地方。我花了两周的时间来解决这个问题