这是我参与8月更文挑战的第10天,活动详情查看: 8月更文挑战sql
Xcode
编译项目以后,咱们会看到一个同名的dSYM
文件,dSYM
是保存十六进制函数地址映射信息
的中转文件,咱们调试的symbols
都会包含在这个文件中,而且每次编译项目的时候都会生成一个新的dSYM
文件,位于/User/<用户名>/Library/Developer/Xcode/Archives
目录下,对于每个发布版本咱们都颇有必要保存对应的Archives
文件;数据库
当咱们软件release
模式打包或上线后,不会像咱们在Xcode
中那样直观的看到用崩溃的错误,这个时候咱们就须要分析crash report
文件了,iOS设备中会有日志文件保存咱们每一个应用出错的函数内存地址,经过Xcode
的Organizer
能够将iOS设备中的DeviceLog
导出成crash
文件,这个时候咱们就能够经过出错的函数地址
去查询dSYM
文件中程序对应的函数名和文件名。大前提是咱们须要有软件版本对应的dSYM
文件,这也是为何咱们颇有必要保存每一个发布版本的Archives
文件了。编程
每个xx.app
和xx.app.dSYM
文件都有对应的UUID
, crash
文件也有本身的UUID
,只要这三个文件的UUID
-致,咱们就能够经过他们解析出正确的错误函数信息了。api
xx.app
文件的UUID
, terminal 中输入命令: dwarfdump --uuid xx.app/xx
(xx表明你的项目名)xx.app.dSYM
文件的UUID
,在terminal中输入命令: dwarfdump --uuid xx.app.dSYM
crash
文件内第一行Incident Identifier
就是该crash
文件的UUID
。同一时间,CPU
只能处理1
条线程,只有1
条线程在工做(执行)多线程并发(同时)执行,实际上是CPU
快速地在多条线程之间调度
(切换)若是CPU调度线程的时间足够快,就形成了多线程并发
执行的 假象思考:若是线程很是很是多,会发生什么状况?CPU
会在N
多线程之间调度,CPU
会累死,消耗大量的CPU
资源每条线程被调度执行的频次会下降(线程的执行效率下降)markdown
能适当提升程序的执行效率能适当提升资源利用率(CPU、内存利用率)网络
线程须要占用必定的内存空间(默认状况下,主线程占用1M,子线程占用512KB),若是开启大量的线程,会占用大量的内存空间,下降程序的性能线程越多,CPU在调度线程上的开销就越大程序设计更加复杂:好比线程之间的通讯、多线程的数据共享;数据结构
GCD
是底层的C语言构成的API,而NSOperationQueue
及相关对象是Objc
的对象。在GCD
中,在队列中执行的是由block
构成的任务,这是一个轻量级的数据结构;而Operation
做为一个对象,为咱们提供了更多的选择;NSOperationQueue
中,咱们能够随时取消已经设定要准备执行的任务(固然,已经开始的任务就没法阻止了),而GCD
无法中止已经加入queue
的block
(实际上是有的,但须要许多复杂的代码);NSOperatio
n可以方便地设置依赖关系,咱们可让一个Operation
依赖于另外一个Operation
,这样的话尽管两个Operation
处于同-个并行队列中,但前者会直到后者执行完毕后再执行;KVO
应用在NSOperation
中,能够监听一个Operation
是否完成或取消,这样子能比GCD
更加有效地掌控咱们执行的后台任务;NSOperation
中,咱们可以设置NSOperation
的priority
优先级,可以使同一个并行队列中的任务区分前后地执行,而在GCD
中,咱们只能区分不一样任务队列的优先级,若是要区分block
任务的优先级,也须要大量的复杂代码;NSOperation
进行继承,在这之,上添加成员变量与成员方法,提升整个代码的复用度,这比简单地将block
任务排入执行队列更有自由度,可以在其之.上添加更多自定制的功能。总的来讲,Operation queue
提供了更多你在编写多线程程序时须要的功能,并隐藏了许多线程调度,线程取消与线程优先级的复杂代码,为咱们提供简单的API入口。从编程原则来讲,-般咱们须要尽量的使用高等级、封装完美的API,在必须时才使用底层API。可是我认为当咱们的需求可以以更简单的底层代码完成的时候,简洁的GCD
或许是个更好的选择,而Operation queue
为咱们提供能更多的选择。NSOperation
拥有更多的函数可用,具体查看api。NSOperationQueue
是在GCD
基础.上实现的,只不过是GCD
更高一层的抽象NSOperationQueue
中,能够创建各个NSOperation
之间的依赖关系。NSOperationQueue
支持KVO
。能够监测operation
是否正在执行(isExecuted
)、是否结束(isFinished
) , 是否取消(isCanceld
)GCD
只支持FIFO
的队列,而NSOperationQueue
能够调整队列的执行顺序(经过调整权重
)。NSOperationQueue
能够方便的管理并发、NSOperation
之间的优先级。NSOperation
的状况:各个操做之间有依赖关系、操做须要取消暂停、并发管理、控制操做之间优先级,限制同时能执行的线程数量.让线程在某时刻中止/继续等。GCD
的状况:通常的需求很简单的多线程操做,用GCD
均可以了,简单高效。从编程原则来讲,通常咱们须要尽量的使用高等级、封装完美的API,在必须时才使用底层API。当需求简单,简洁的GCD
或许是个更好的选择,而Operation queue
为咱们提供能更多的选择。单一职责原则
Info.plist
Mach-O
加载Mach-O
文件(递归调用Mach-o
加载方法)attribute(constructor)
的C函数C++
静态对象加载,调用Objc
的+load
函数main
函数UlApplicationMain
函数UIApplication
对象UIApplicationDelegate
对象并复制info.plist
,设置程序启动的一些属性Main Runloop
循环UlApplicationDelegate
对象开始处理监听事件application.didFinishLaunchingWithOptions:
方法果info.plist
中配置了启动的storyBoard
的文件名,则加载storyboard
文件UIWindow
->rootViewController
->显示App
启动过程当中每一个步骤都会影响启动性能,可是有些部分所消耗的时间少之又少,另外有些部分根本没法避免,考虑到投入产出比,咱们只列出咱们能够优化的部分: main
(函数以前耗时的影响因素ObjC
类越多,启动越慢C
的constructor
函数越多,启动越慢C++
静态对象越多,启动越慢ObjC
的+load
越多,启动越慢实验证实,在ObjC
类的数目 同样多的状况下,须要加载的动态库越多,App
启动就越慢。一样的,在动态库同样多的状况下,ObjC
的类越多,App
的启动也越慢。须要加载的动态库从1
个上升到10
个的时候,用户几乎感知不到任何分别,但从10
个, 上升到100
个的时候就会变得十分明显。同理,100
个类和1000
个类, 可能也很难查察以为出,但1000
个类和10000
个类的分别就开始明显起来。一样的,尽可能不要写atribute((constrcror))
的C函数
,也尽可能不要用到C++
的静态对象;至于ObjC
的+load
方法,彷佛你们已经习惯不用它了。任何状况下,能用dispatch_ _once()
来完成的,就尽可能不要用到以上的方法。main()
函数以后耗时的影响因素main()
函数的耗时applicationWillFinishLaunching
的耗时childViewController
的加载、view
及其subviews
的加载applicationWillFinishLaunching
的耗时0x8badf00d
:该编码表示应用是由于发生watchdog
超时而被iOS
终止的。一般是应用花费太多时间而没法启动、终止或响应用系统事件。0xbad22222
:该编码表示VolP
应用由于过于频繁重启而被终止Oxdead10cc
: 该代码代表应用由于在后台运行时占用系统资源,如通信录数据库不释放而被终止。Oxdeadfa11
:该代码表示应用是被用户强制退出的。根据苹果文档,强制退出发生在用户长按开关按钮直到出现“滑动来关机”,而后长按Home按钮。强制退出将产生包含0xdeadfa11异常编码的崩溃日志,由于大多数是强制退出是由于应用阻塞了界面。NSUserDefaults
,sqlite
存储文件数据加密,保护账号和关键信息iOS
应用防反编译加密技术之二:对程序中出现的URL
进行编码加密,防此URL
被静态分析iOS
应用防反编译加密技术之三:对客户端传输数据提供加密方案,有效防止经过网络接口的拦截获取数据iOS
应用防反编译加密技术之四:对应用程序的方法名
和方法
体进行混淆,保证源码被逆向后没法解析代码iOS
应用防反编译加密技术之五:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低Runtime
、Runloop
、block
、SDWebImage
、AFN
、YYCache
、GCD
等等底层实现多线程