了解iOS崩溃

我刚刚收到Crashlytics的第一份崩溃报告,并试图纠正这个问题。 不幸的是,只有在旧设备上运行的代码行,所以我不能在我的iPhone 6上testing它。

Crashlytics的崩溃报告突出了两个线程,第一个读取:

Fatal Exception: NSInvalidArgumentException -[CABasicAnimation altitude]: unrecognized selector sent to instance 0x17734440 

第二个是:

 Crashed: Map Update :: NSOperation 0x1a839470 SIGABRT ABORT at 0x316a3dfc 

这两个线程的代码行是:

 let relativeAlt = mylocation.altitude - appDelegate.elevation 

哪里:

 let mylocation = self.mapView.myLocation let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate) 

我试图了解我在崩溃报告中读到的内容。 我看到它的方式不明白由于某种原因所做的altitude参考? 这对我来说没有意义,因为这个崩溃似乎发生在该应用程序已经运行了几分钟没有错误之后,突出显示的代码行可能在应用程序崩溃之前运行数百次。 这里真的发生了什么?

附加信息:

自写以来,我收到了另外的崩溃,我相信这是源于同一个问题:

 Crashed: Map Update :: NSOperation 0x19fb2d50 EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x11d077ca Crashed: Map Update :: NSOperation 0x145ced50 EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x81450a64 

第一个在我的代码中突出显示了以下代码行(我相信自从这个testing版发布以来,我已经在应用程序中工作了,行号已经稍微改变了):

 self.lastLocation = (self.mapView.myLocation as CLLocation).coordinate 

而第二次事故只是给了我:

 libobjc.A.dylib objc_msgSend + 5 

第一个新的崩溃(提供了一行代码)提供了这个报告:

 Thread : Crashed: Map Update :: NSOperation 0x19fb2d50 0 libobjc.A.dylib 0x3105c708 objc_release + 7 1 FlightTracker 0x000ba830 FlightTracker.MapViewController. (locationManager (FlightTracker.MapViewController) -> (Swift.ImplicitlyUnwrappedOptional<ObjectiveC.CLLocationManager>, didUpdateLocations : Swift.ImplicitlyUnwrappedOptional<Swift.Array<Swift.AnyObject>>) -> ()).(closure #1) (MapViewController.swift:168) 2 Foundation 0x244ce0fd __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 8 3 Foundation 0x24438fc5 -[NSBlockOperation main] + 148 4 Foundation 0x2442b845 -[__NSOperationInternal _start:] + 768 5 Foundation 0x244d0a57 __NSOQSchedule_f + 186 6 libdispatch.dylib 0x315ad5d9 _dispatch_queue_drain$VARIANT$mp + 948 7 libdispatch.dylib 0x315ad0a9 _dispatch_queue_invoke$VARIANT$mp + 84 8 libdispatch.dylib 0x315af0d3 _dispatch_root_queue_drain + 330 9 libdispatch.dylib 0x315b01fb _dispatch_worker_thread3 + 106 10 libsystem_pthread.dylib 0x31720e25 _pthread_wqthread + 668 

可能不是你的问题,但我只是有一个SIGABRT,这使我疯了(这就是我最终看到这个问题),我会张贴我的解决scheme,以防止未来的SO spelunker一些。

在我的(iPad,不是那么重要)的应用程序,你可以推一个button,导致创build一个非全屏的UIViewController ,其中包含一个UITableView ,这个viewController是通过UIPopoverController呈现。

在我的情况下,我有一个拧我的tableView项加载,在创buildtableView单元格时,我最终试图将一个空值添加到字典中。 (这是一个很长的故事,与基础设施类有关,预计数据将以某种格式)。

无论如何,尝试访问newViewController.view导致该行SIGABRT,不知道问题是与填充tableView单元格有关。 在堆栈跟踪中,没有任何与tableView相关的东西是显而易见的,所以我花了相当长的时间来缩小范围。 我最终只是猜测“也许这是tableview”,并断开IBOutlet和委托/数据源,看看是否崩溃消失。

…而且确实如此。 这导致我find真正的问题。

无论如何,这是我的故事。 希望对某人有所帮助。

由于缺乏完整/正确的崩溃报告以及缺less更多的代码和体系结构,以下是使用可用信息的一小部分的假设。

你正在访问后台线程(NSOperation队列)中的一个variables,在另一个线程上释放,现在不再可用,所以指针显示内存中的其他随机对象。 而那个随机的物体当然不知道如何处理altitude信息,然后造成坠毁。

您必须确保在后台线程中使用的所有variables都可用,而不是在另一个线程中释放。

哇,我刚刚有另一个“不可能追查”的解决scheme,这是驱使我疯狂。

今天早些时候,我做了一个重大的重构,因为我的游戏中的一些对象有RFCFoo名字,有些像RfcBar ,我想要规范大小写。

所以我使用XCode的Refactor->Rename...工具,它工作得很好,除了一件事:

它没有重新命名一个特定的.xib文件,当我试图将其加载为“RfcBlahBlah.xib”时,它保留为“RFCBlahBlah.xib”

再次,我希望这certificate有用的一些未来SOsearch。