我怎么知道我的应用程序到底在哪里崩溃? 我的用户收到了很多崩溃但我无法自行重现崩溃,崩溃日志也没有显示特定的行:
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
}
答案 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)
希望这有帮助