2015-07-09 73 views
0

我是Swift的新手。在Swift崩溃的情况下转储堆栈和异常

当我有一个很艰难的漏洞破解上Objective-C我一般像这样的东西取代我main.m文件:

int main(int argc, char *argv[]) { 
    int retVal; 
    @autoreleasepool { 
    @try { 
     retVal = UIApplicationMain(argc, argv, nil, nil); //*** 
    } 
    @catch (NSException *exception) { 
     NSLog(@"\n\nSTACK SYMBOLS\n%@",[exception callStackSymbols]); 
     NSLog(@"\n\nSTACK RETURN ADDRESSES\n%@", 
        [exception callStackReturnAddresses]); 
     NSLog(@"\n\nOBJECT: %@",[exception name]); 
     NSLog(@"\n\nUSER INFO DICT: %@",[exception userInfo]); 
     NSLog(@"\n\nREASON: %@",[exception reason]); 
     retVal = 1; 
    } 
    } 
    return retVal; 
} 

这将有助于收集有关崩溃的信息。

当应用程序崩溃时,代码将转储堆栈,返回地址和大量帮助识别违规行的信息。

有没有这样的事情可以做Swift

+0

更新您的问题与您试图转换迅速。 – rmaddy

回答

1

在纯Swift中没有这种模式的真实等价物,因为在Swift中没有等效于@try。 (Swift2的try在使用和实现方面是不相关和根本不同的。)

也就是说,有一种方法可以覆盖程序启动。从Programming Guide

UIApplicationMain

应用此属性的一类,表明它是应用程序委托。使用此属性相当于调用UIApplicationMain函数并将此类的名称作为委托类的名称传递。

如果您不使用此属性,请提供一个main.swift文件,其中包含一个调用UIApplicationMain(_:_:_:)函数的主函数。例如,如果您的应用程序使用UIApplication的自定义子类作为其主类,请调用UIApplicationMain(_:_:_:)函数而不是使用此属性。

因此,您可以从应用程序委托中删除UIApplicationMain,然后按照说明创建swift.main文件。但你不能在那里发现异常。

但是,你当然可以在ObjC中使用你的上述main.m,它也会以同样的方式工作。只需删除UIApplicationMain属性即可。

(大多数的你在做什么这里看起来非常相似,你从崩溃堆得到什么正常。这是否真的给你一个标准的崩溃报告更好的信息?)

+1

有时候会。当Xcode不能解释这个问题时,我会使用它,有时它通过给我一些东西来帮助识别问题。谢谢。 – SpaceDog

相关问题