【问题标题】:Debugging NSNotification crash that won't reproduce under XCode调试不会在 XCode 下重现的 NSNotification 崩溃
【发布时间】:2013-03-26 03:40:56
【问题描述】:

我的测试版用户平均每小时会看到一次以下崩溃:

0   libobjc.A.dylib                 0x33182f78 objc_msgSend + 16
1   Foundation                      0x3497e4f8 __57-[NSNotificationCenter addObserver:selector:name:object:]_block_invoke_0 + 12
2   CoreFoundation                  0x35530540 ___CFXNotificationPost_block_invoke_0 + 64
3   CoreFoundation                  0x354bc090 _CFXNotificationPost + 1400
4   Foundation                      0x348f23e4 -[NSNotificationCenter postNotificationName:object:userInfo:] + 60
5   Foundation                      0x348f3c14 -[NSNotificationCenter postNotificationName:object:] + 24
6   libdispatch.dylib               0x338f1c52 _dispatch_call_block_and_release + 6
7   libdispatch.dylib               0x338fce8a _dispatch_main_queue_callback_4CF$VARIANT$up + 190
8   CoreFoundation                  0x355372a6 __CFRunLoopRun + 1262
9   CoreFoundation                  0x354ba49e CFRunLoopRunSpecific + 294
10  CoreFoundation                  0x354ba366 CFRunLoopRunInMode + 98
11  GraphicsServices                0x33255432 GSEventRunModal + 130
12  UIKit                           0x32c92cce UIApplicationMain + 1074
13  Ars Logica                      0x00039ecc main (main.m:16)
14  Ars Logica                      0x00039e80 start + 32

我有两个并发症:

1) 我没有调用 NSNotificationCenter。

2) 尽管我付出了巨大的努力,但在使用 XCode 运行时从未发生过这种情况。

我找不到内存不足报告和崩溃事件之间的关联。

坦率地说,我不确定从这里去哪里。 2 号并发症显然是个大问题。

任何建议或指示将不胜感激。


作为记录,这被证明是 iAd 框架中的一次崩溃。具体来说,我按照 Apple 示例准备好整页插页式广告,但当我进入后台时,我并没有让它失效。当我从后台出来时,有时会向旧上下文发送一条通知,说明广告服务器的附件已丢失。转到后台时使广告上下文无效可以很好地解决所有问题。

【问题讨论】:

  • 一个小问题,它是 Xcode,而不是 XCode。

标签: ios xcode nsnotificationcenter


【解决方案1】:

您最好的选择可能是使用方法调配和一个类别来替换:

+ addObserver:selector:name:object:

NSNotificationCenter中。

使用您自己的版本来记录所有参数的内容,然后调用真实版本。这样,当您的测试人员看到崩溃时,他们可以查看设备日志以查看传递给该方法的最后一件事在做什么。这可能会让您有足够的洞察力来确定系统的哪个区域正在使用通知中心。

另外,您使用的是 ARC 吗?使用 ARC 如果可能发生这样的错误,我会感到非常惊讶,似乎您正在将某些内容传递到系统中,然后以某种方式在幕后附加到通知,但在系统仍有参考时被释放。

这是一个与您的需求相关的方法调配示例(替换类级别的方法):

How to swizzle a class method on iOS?

显然不要在有货的情况下运送到商店......

【讨论】:

  • 我很害怕,更多的日志记录是你最好的希望,而不是我害怕。此外,在 XCode 中,您是否尝试过在代码的不同部分重复触发模拟器中的内存警告?
  • 是的,我已经非常全面地处理了内存警告。我认为调酒是要走的路。
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 2016-04-25
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
相关资源
最近更新 更多