如何弄清楚我的iOS应用程序崩溃的原因(EXC_BREAKPOINT)?

时间:2016-03-10 10:32:10

标签: ios swift crash crashlytics nscoding

我怎么知道我的应用程序到底在哪里崩溃? 我的用户收到了很多崩溃但我无法自行重现崩溃,崩溃日志也没有显示特定的行:

Thread : Crashed: com.apple.main-thread
0  myapp                  0x22d1d4 specialized ItemType.init(coder : NSCoder) -> ItemType? (ItemType.swift)
1  myapp                  0x22c72c @objc ItemType.init(coder : NSCoder) -> ItemType? (ItemType.swift)
2  EventKitUI                     0x234734a5 (Missing)
3  EventKitUI                     0x23479639 (Missing)
4  EventKitUI                     0x234161db (Missing)
5  EventKitUI                     0x234734a5 (Missing)
6  EventKitUI                     0x234728d3 (Missing)
7  myapp                  0x1e9df4 specialized Item.init(coder : NSCoder) -> Item? (Item.swift:162)
8  myapp                  0x1db9b8 @objc Item.init(coder : NSCoder) -> Item? (Item.swift)
9  EventKitUI                     0x234734a5 (Missing)
10 EventKitUI                     0x234728d3 (Missing)
11 EventKitUI                     0x23471bc7 (Missing)
12 myapp                  0x26f370 savedSearchList.getLastItem() -> Item! (savedItemList.swift:71)
13 myapp                  0x26c008 specialized MenuInitializerViewController.getSideMenuViewController() -> UIViewController (MenuInitializerViewController.swift:39)
14 myapp                  0x18388c SharedAppDelegate.showMainInterface() -> () (SharedAppDelegate.swift:427)
15 myapp                  0x18398c @objc SharedAppDelegate.showMainInterface() -> () (SharedAppDelegate.swift)
16 myapp                  0x188a48 SharedAppDelegate.(retreiveFirstData(SharedAppDelegate) -> () -> ()).(closure #1) (SharedAppDelegate.swift:290)
17 myapp                  0x2657a4 partial apply for UserAppData.(getFirstData(UserAppData) -> (() -> (), failure : (error : NSError) -> ()) -> ()).(closure #3) (UserAppData.swift:45)
18 myapp                  0x263828 partial apply for thunk (UserAppData.swift)
19 myapp                  0x268c28 UserAppData.(getDiffusionsGroup(UserAppData) -> (() -> (), failure : (error : NSError) -> ()) -> ()).(successBlock #1)(AFHTTPRequestOperation!, responseObject : AnyObject!)() (UserAppData.swift:788)
20 myapp                  0x266684 partial apply for UserAppData.(getDiffusionsGroup(UserAppData) -> (() -> (), failure : (error : NSError) -> ()) -> ()).(successBlock #1)(AFHTTPRequestOperation!, responseObject : AnyObject!)() (UserAppData.swift)
21 libtzupdate.dylib              0x344ffe2f (Missing)
22 libtzupdate.dylib              0x344ffe1b (Missing)
23 libtzupdate.dylib              0x345046c9 (Missing)
24 CoreAudio                      0x226dc535 (Missing)
25 CoreAudio                      0x226daa2f (Missing)
26 CoreAudio                      0x2262d0d9 (Missing)
27 CoreAudio                      0x2262cecd (Missing)
28 GeoServices                    0x2b9a2af9 (Missing)
29 UIKit                          0x268b62dd UIApplicationMain + 144
30 myapp                  0x10f2d4 main (AppDelegate.swift:16)
31 libtzupdate.dylib              0x34528873 (Missing)

我知道它可能来自ItemType unarchive初始化程序,但我不知道它可能有什么问题:

required convenience init?(coder aDecoder: NSCoder)
{
    self.index = aDecoder.decodeIntegerForKey("index")
    self.name = aDecoder.decodeObjectForKey("name") as! String
    self.id = aDecoder.decodeObjectForKey("id") as! String
    self.type = Type(rawValue: aDecoder.decodeIntegerForKey("type")) ?? .Default
}

2 个答案:

答案 0 :(得分:0)

尝试在

中添加异常断点和/或Swift错误断点
View->Navigator->Show Breakpoint Navigator 

然后点击底部的+图标

答案 1 :(得分:0)

我不确定这是否有帮助,但这两行不是非常安全的代码

self.name = aDecoder.decodeObjectForKey("name") as! String
self.id = aDecoder.decodeObjectForKey("id") as! String

您强制将对象强制转换为String,而不检查它是否具有值。默认情况下,ObjectsForKeys为nil,直到您第一次设置它们为止。 因此,如果您没有至少设置一次对象,这两行可能会导致崩溃。尝试使用??零合并运算符,以确保不会发生这种情况。

self.name = aDecoder.decodeObjectForKey("name") as? String ?? self.name
self.id = aDecoder.decodeObjectForKey("id") as? String ?? self.id

现在检查对象是否退出(如?String),如果它没有使用默认名称/ id(?? self.name)

我不确定这是否会导致崩溃,但这会改善您的代码。 保存Enum的代码似乎是alrite,因为你正在使用??运营商,所以我不认为这会导致问题。

你只需要对ObjectsForKeys进行nil检查,因为它们是AnyObject类型,因此在设置一次之前不知道它们实际上是什么对象,因此它可能导致nil崩溃。

将此与BoolForKey进行比较,你不必这样做,因为它知道你正在处理布尔值,因此它默认为自动为假。

另外,你正在做我在这里看到的同样的事情,这不是使用常量的键。这很容易产生错别字。

在班级上方创建一个结构

struct Key {
   static let name = "Name"
   static let id = "ID"
}

而不是使用像这样的键

...objectForKey(Key.name) 

希望这有帮助