Swift Crash libobjc.A.dylib objc_msgSend

时间:2016-03-07 04:34:05

标签: ios iphone swift crash crashlytics

我使用crashlytics来解决AppStore中应用程序的崩溃问题。有些用户正在崩溃,我似乎无法在我的机器上重现(也没有几个朋友通过TestFlight测试我的应用程序)。这是来自Fabric的日志:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x181d09bdc objc_msgSend + 28
1  Foundation                     0x18304be20 __NSThreadPerformPerform + 340
2  CoreFoundation                 0x182640efc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
3  CoreFoundation                 0x182640990 __CFRunLoopDoSources0 + 540
4  CoreFoundation                 0x18263e690 __CFRunLoopRun + 724
5  CoreFoundation                 0x18256d680 CFRunLoopRunSpecific + 384
6  GraphicsServices               0x183a7c088 GSEventRunModal + 180
7  UIKit                          0x1873e4d90 UIApplicationMain + 204
8  <App Name>                     0x1000b2f0c main (AppDelegate.swift:14)
9  libdispatch.dylib              0x18210e8b8 (Missing)

我似乎无法理解这意味着什么,并搜索其他问题寻求帮助,但似乎无法找到答案。我也很快联系了Crashlytics团队,他们告诉我以下内容:

  

听起来这次崩溃的根源是某种内存崩溃。这导致Crashlytics在完成写入之前关闭,导致崩溃报告中出现这种情况。

任何好的方法来调试这个以确定崩溃的来源?感谢帮助!

修改 在崩溃报告的崩溃报告中添加了Threads的屏幕截图,以防有人想从那里获得一些信息: enter image description here

Thread : com.apple.NSURLConnectionLoader
0  libsystem_kernel.dylib         0x1823354bc mach_msg_trap + 8
1  libsystem_kernel.dylib         0x182335338 mach_msg + 72
2  CoreFoundation                 0x182764ac0 __CFRunLoopServiceMachPort + 196
3  CoreFoundation                 0x1827627c4 __CFRunLoopRun + 1032
4  CoreFoundation                 0x182691680 CFRunLoopRunSpecific + 384
5  CFNetwork                      0x182e01434 +[NSURLConnection(Loader) _resourceLoadLoop:] + 412
6  Foundation                     0x18316fc40 __NSThread__start__ + 1000
7  libsystem_pthread.dylib        0x182417b28 _pthread_body + 156
8  libsystem_pthread.dylib        0x182417a8c _pthread_body + 154
9  libsystem_pthread.dylib        0x182415028 thread_start + 4

Thread : AVAudioSession Notify Thread
0  libsystem_kernel.dylib         0x1823354bc mach_msg_trap + 8
1  libsystem_kernel.dylib         0x182335338 mach_msg + 72
2  CoreFoundation                 0x182764ac0 __CFRunLoopServiceMachPort + 196
3  CoreFoundation                 0x1827627c4 __CFRunLoopRun + 1032
4  CoreFoundation                 0x182691680 CFRunLoopRunSpecific + 384
5  libAVFAudio.dylib              0x188959834 GenericRunLoopThread::Entry(void*) + 164
6  libAVFAudio.dylib              0x18892e3a8 CAPThread::Entry(CAPThread*) + 84
7  libsystem_pthread.dylib        0x182417b28 _pthread_body + 156
8  libsystem_pthread.dylib        0x182417a8c _pthread_body + 154
9  libsystem_pthread.dylib        0x182415028 thread_start + 4

编辑2: 我正在使用所有Swift代码,我将消息转发给Selectors的方式如下:

NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: Selector("updateProgressCircle"), userInfo: nil, repeats: true)

func updateProgressCircle() {
   // Do something
}

问题是我无法在本地重现任何崩溃。只有用户才面临这种情况。我以类似的方式称呼选择器。

2 个答案:

答案 0 :(得分:3)

当您尝试将消息转发到选择器时(使用旧的Objective-C转发消息传递),会发生objc_msgSend崩溃。这可以通过目标动作,通知,协议声明,定时器,执行选择器或涉及传递函数选择器语法的任何其他函数来生成:即:"doSomethingWithThis:"

我可以从崩溃日志中看到你的应用程序中有快速组件(至少是AppDelegate)。与Obj-C组件不同,Swift组件与开箱即用的Obj-C前向消息传递系统不兼容。

我的直觉是你的代码中有一个符合协议的swift对象,被添加为目标/通知观察者,或者某种程度上期望它的一个函数被前向消息传递调用。我建议你通过你的课程,看看是否是这种情况。一旦找到罪魁祸首,您可以通过将@objc附加到期望该消息的函数来轻松修复此错误。

即: 如果你的函数在swift类中被调用(并且,例如,注册了通知):

func yourFunction() {
   //your code
}

称之为:

@objc func yourFunction() {
  //your code
}

这是一个很长的镜头,但我希望这有帮助!

答案 1 :(得分:0)

我相信这可能与AVAudioPlayer有关。在我的情况下,我有同样的错误,并通过注意到我的两个正在运行的线程有AVAudioPlayer相关的内容得到了一些提示。

我有一个AVAudioPlayer类变量,我重新初始化而不重置为nil。我在AVAudioPlayer变量初始化之前添加了下面的代码,并且自那以后没有发生错误。

audioPlay是变量名。

if audioPlay != nil
{
    //print( "blabla" )
    audioPlay?.stop()
    audioPlay = nil
}