Swift 关于Crash的一些看法

Swift 关于Crash的一些看法,第1张

在Swift中, 编译器不再支持预处理指令。作为替代,它使用编译时的属性和build配置

在 Xcode 中 Build Setting 界面, 搜索 flags , 最下面就是.

我们可以通过在不同的环境下设置不同的 Tag , 来控制版本.

可以使用 #if 判定build的参数动态编译

自定义Log

还有一种方式实现版本管理就是通过切换不同的Target. 这里在参考中有详解.

在 腾讯Bugly官网 登录账号, 注册应用. 获取到AppKey.

在 文档中心 , 查看具体使用

先讲讲Object-C的方案

那怎么分析呢?

小节:

在Swift中怎么拦截crash, 避免程序崩溃呢?

目前除了调用 try-catch 方法, 并无其他比较好的解决方案, 但是这也是只能拦截 Foundation 框架里面的 NSArray , NSString 这种类型的. 并不能处理Array, String这种结构体.

既然写到这里, 推荐一个大佬写的 Swift 框架 GodEye , 里面有一个 CrashEye , 就是通过NSSetUncaughtExceptionHandler 和 signal(SIGABRT, SignalHandler), 来处理异常, 但是无法避免崩溃, 具体我在 iOS崩溃日志 里有提到.

参考

最详细 Xcode的Targets管理项目的公开版本、测试版本、预发布版本等等

OC版LSSafeProtector

Swift版CrashEye

Swift是什么?

Swift是苹果于WWDC 2014发布的编程语言,这里引用The Swift Programming Language的原话:

Swift is a new programming language for iOS and OS X apps that builds on the best of C and Objective-C, without the constraints of C compatibility. Swift adopts safe programming patterns and adds modern features to make programming easier, more flexible and more fun. Swift’s clean slate, backed by the mature and much-loved Cocoa and Cocoa Touch frameworks, is an opportunity to imagine how software development works. Swift is the first industrial-quality systems programming language that is as expressive and enjoyable as a scripting language.

简单的说:

Swift用来写iOS和OS X程序。(估计也不会支持其它屌丝系统)

Swift吸取了C和Objective-C的优点,且更加强大易用。

Swift可以使用现有的Cocoa和Cocoa Touch框架。

Swift兼具编译语言的高性能(Performance)和脚本语言的交互性(Interactive)。

Swift语言概览

基本概念

注:这一节的代码源自The Swift Programming Language中的A Swift Tour。

Hello, world

类似于脚本语言,下面的代码即是一个完整的Swift程序。

println("Hello, world")

变量与常量

Swift使用var声明变量,let声明常量

var myVariable = 42 myVariable = 50 let myConstant = 42

类型推导

Swift支持类型推导(Type Inference),所以上面的代码不需指定类型,如果需要指定类型:

let explicitDouble : Double = 70

Swift不支持隐式类型转换(Implicitly casting),所以下面的代码需要显式类型转换(Explicitly casting):

let label = "The width is " let width = 94 let width = label + String(width)

字符串格式化

Swift使用\(item)的形式进行字符串格式化:

let apples = 3 let oranges = 5 let appleSummary = "I have \(apples) apples." let appleSummary = "I have \(apples + oranges) pieces of fruit."

数组和字典

Swift使用[] *** 作符声明数组(array)和字典(dictionary):

var shoppingList = ["catfish", "water", "tulips", "blue paint"] shoppingList[1] = "bottle of water" var occupations = [ "Malcolm": "Captain", "Kaylee": "Mechanic", ] occupations["Jayne"] = "Public Relations"

一般使用初始化器(initializer)语法创建空数组和空字典:

let emptyArray = String[]() let emptyDictionary = Dictionary<String, Float>()

如果类型信息已知,则可以使用[]声明空数组,使用[:]声明空字典。

控制流

概览

Swift的条件语句包含if和switch,循环语句包含for-in、for、while和do-while,循环/判断条件不需要括号,但循环/判断体(body)必需括号:

let individualScores = [75, 43, 103, 87, 12] var teamScore = 0 for score in individualScores { if score >50 { teamScore += 3 } else { teamScore += 1 } }

可空类型

结合if和let,可以方便的处理可空变量(nullable variable)。对于空值,需要在类型声明后添加?显式标明该类型可空。

var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var gretting = "Hello!" if let name = optionalName { gretting = "Hello, \(name)" }

灵活的switch

Swift中的switch支持各种各样的比较 *** 作:

let vegetable = "red pepper" switch vegetable { case "celery": let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": let vegetableComment = "That would make a good tea sandwich." case let x where x.hasSuffix("pepper"): let vegetableComment = "Is it a spicy \(x)?" default: let vegetableComment = "Everything tastes good in soup." }

Swift中的断言与ObjectiveC中的断言有很多不一样的地方,使用起来差不多。

什么是断言?

断言通常是用于诊断条件是否满足,如果不能满足就会中断程序。使用assert函数来添加断言。

如果条件为真,那么就什么也不做,可以继续往下走。如果条件为假,那么就会抛出crash信息,程序中断退出。

assert函数的方法为:

对于此方法,我们有很多个缺省值的参数,因此我们也可以传我们自定义的参数。

Swift还提供了直接断言失败的API:

当前这个断言失败的API也可以传参数,指定错误信息。指定特定的错误信息,目的是让我们开发人员更精准地定位到出错的问题所在。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7933272.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存