【问题标题】:why does iOS app crash when receiving UIApplicationDidReceiveMemoryWarningNotification为什么iOS应用在收到UIApplicationDidReceiveMemoryWarningNotification时会崩溃
【发布时间】:2017-09-28 13:32:15
【问题描述】:

最近,我收到了很多来自使用 iOS 8.x 的客户的崩溃日志。这里是日志,

Application received signal SIGSEGV
current state:Foreground,total time:0H0M34S,active time:0H0M29S
iOS Version:8.1.1 (12B435)
(null)
((
0 CoreFoundation 0x219b060f exceptionPreprocess (in CoreFoundation) + 151
1 libobjc.A.dylib 0x35b53c77 objc_exception_throw + 38
2 CoreFoundation 0x219b053d -[NSException initWithCoder:] (in CoreFoundation) + 1
3 my app 0x47f61b UmengSignalHandler (in my app) + 137
4 libsystem_platform.dylib 0x3622f09b _sigtramp + 34
5 CoreFoundation 0x21968f15 CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ (in CoreFoundation) + 13
6 CoreFoundation 0x281f4e4d _CFXNotificationPost + 1800
7 Foundation 0x225f8ec1 -[NSNotificationCenter postNotificationName:object:userInfo:] (in Foundation) + 77
8 Foundation 0x225fda3f -[NSNotificationCenter postNotificationName:object:] (in Foundation) + 31
9 UIKit 0x250bf913 -[UIApplication _performMemoryWarning] (in UIKit) + 139
10 libdispatch.dylib 0x2f78340f _dispatch_client_callout (in libdispatch.dylib) + 23
11 libdispatch.dylib 0x2f798709 _dispatch_source_latch_and_call (in libdispatch.dylib) + 621
12 libdispatch.dylib 0x2f791f3d _dispatch_source_invoke$VARIANT$mp (in libdispatch.dylib) + 213
13 libdispatch.dylib 0x2f78e035 _dispatch_main_queue_callback_4CF$VARIANT$mp (in libdispatch.dylib) + 329
14 CoreFoundation 0x21976631 CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE (in CoreFoundation) + 9
15 CoreFoundation 0x21974d51 __CFRunLoopRun (in CoreFoundation) + 1513
16 CoreFoundation 0x281f2b31 CFRunLoopRunSpecific + 476
17 CoreFoundation 0x281f2943 CFRunLoopRunInMode + 106
18 GraphicsServices 0x2f5d2051 GSEventRunModal + 136
19 UIKit 0x2b7e86f1 UIApplicationMain + 1440
20 my app 0x28b8cd main (in eif-ios-app) (main.m:27)
21 libdyld.dylib 0x2f7beaaf start (in libdyld.dylib) + 3
)

从日志中,我们可以发现应用程序在收到内存不足警告时崩溃了。我的项目代码从未运行,所以我猜僵尸对象发生了。 因为僵尸与 UIApplicationDidReceiveMemoryWarningNotification 相关联,所以我搜索了每个观察通知的地方。 结果,在 dealloc 中删除了所有观察者,除了属于单例的观察者。 现在我不知道如何解决这个崩溃。感谢您的帮助。

【问题讨论】:

  • 再次接收崩溃日志,但这一次我发现App在UINibStorage类的选择器setArchiveData处停止运行。 UINibStorage,它是私有类,UINibStorage 对象由UINib 创建和保存。我发现 UINib 是在 UIApplicationDidReceiveMemoryWarningNotification 上签名的,在收到通知时它会执行 [self.nibStorage setArchiveData],然后崩溃。现在找到崩溃的位置,但如何修复?感谢您的帮助。

标签: ios objective-c


【解决方案1】:

有多种方法可以调试问题。

  1. 在调试时,您可以在 XCode 的调试导航器中检查内存。如果你推新屏幕,内存应该增加,如果你弹出屏幕,内存应该减少。如果 if 没有减少,这可能是内存泄漏的情况,您需要解决它以防止崩溃。

  2. 在 XCode 中,有一种方法可以在调试时生成内存图。您可以使用它来找出发生内存泄漏的实例。

【讨论】:

  • @Punnet 感谢您的建议。我通过 Xcode Memory Graph Debugger 和仪器检查了内存。不幸的是,我没有发现泄漏。我怀疑这不是关于内存泄漏的问题。如果控制器没有释放,我的应用程序不会崩溃,因为泄漏的对象仍然可以收到内存不足的通知。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多