一、ios沙盒机制
屏幕快照 2018-07-12 上午11.38.29.png
应用间数据不能共享,不能访问其他沙盒内的数据,不能把数据写入到其他沙盒中,安全,app间访问使用url scheme机制。
Documents:用来存放app运行生成的需要持久化的数据,也存放用户生成的数据。iTunes和设备同步时,该数据会被同步。
Library/caches,网络下载的数据(文件,图片,音视频等)存放在此,iTunes和设备同步时该数据不会同步。
Library/preferences,存放用户偏好数据,以NSUserDefault这个类来访问,不能自己创建,iTunes和设备同步时,该数据会被同步。
tmp,临时存放的不重要的数据,app不运行时会被系统清理,iTunes和设备同步时,该数据不会被同步。
沙盒中各文件存储不能随意,否则会被App Store拒绝上传。比如把网络下载的数据存放在Documents中。
二、ios中的多线程
在ios多线程开发中,可以通过NSOperation和GCD来进行,GCD是一套C语言API,NSOperation是基于GCD封装的OC库。主队列是串行队列,拥有主线程,关于UI的渲染和刷新只能在主线程中完成。主线程是个常驻线程,因为默认开启了mainrunloop,其他子线程则不是常驻线程,因为默认没有开启runloop,线程和runloop是一一对应的关系,非常驻线程在执行完任务后会被销毁。
非主队列的串行队列只能开启一个子线程,并发队列可以开启多个子线程。串行队列执行任务是串行执行的,并发队列执行任务可以并发执行。同步任务都是在主线程中执行,异步任务会被放在子线程中去执行。同步任务的优先级高于异步任务,所以当队列中有同步任务时,只有等同步任务执行完成之后才会执行该队列后面的任务。所以在主线程中执行同步任务会造成死锁,因为串行队列是串行执行,同步任务提交到队列中是排队在队列尾部,但是同步任务又必须要执行完才能往后执行其它任务,这就造成了死循环。
ios中主线程的堆栈空间是1M,其它子线程都是512KB。
ios中App切换到后台之后,大概有5s左右的时间处理,之后所有线程将会被挂起,直到app重新切换到前台。当然官方API提供了一个方法可以向系统借用更多的时间(10 min左右)。线程被挂起后并不会被系统清理,只有当系统内存紧张时,处于后台不活跃的进程才会被系统清理,系统是尽量维持足够多的后台进程在内存中。
三、ios动态库
framework是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用,作为一名Cocoa/Cocoa Touch程序员每天都要跟各种各样的Framework打交道。Cocoa/Cocoa Touch开发框架本身提供了大量的Framework,比如Foundation.framework/UIKit.framework/AppKit.framework等。需要注意的是,这些framework无一例外都是动态库。
但残忍的是,Cocoa Touch上并不允许我们使用自己创建的framework。不过由于framework是一种优秀的资源打包方式,拥有无穷智慧的程序员们便想出了以framework的形式打包静态库的招数,因此我们平时看到的第三方发布的framework无一例外都是静态库,真正的动态库是上不了AppStore的。
iOS8开始,apple放开了动态库的使用,用户可以通过xcode创建动态库的framework,并且集成到app中,提交到appstore已经不会被拒绝。
动态库能做什么?
和静态库在编译时和app代码链接并打进同一个二进制包中不同,动态库可以在运行时手动加载,这样就可以做很多事情,比如:
应用插件化
目前很多应用功能越做越多,软件显得越来越臃肿。因此插件化就成了很多软件发展的必经之路,比如支付宝这种平台级别的软件。
首页上密密麻麻的功能,而且还在增多,照这个趋势发展下去,软件包的大小将会不可想象。目前常用的解决方案是使用web页面,但用户体验和Native界面是没法比的。
设想,如果每一个功能点都是一个动态库,在用户想使用某个功能的时候让其从网络下载,然后手动加载动态库,实现功能的的插件化,就再也不用担心功能点的无限增多了。
软件版本实时模块升级
还在忍受苹果动辄一周,甚至更长的审核周期吗?有了动态库妈妈就再也不用担心你的软件升级了!
如果软件中的某个功能点出现了严重的bug,或者想在其中新增功能,你的这个功能点又是通过动态库实现的,这时候你只需要在适当的时候从服务器上将新版本的动态库文件下载到本地,然后在用户重启应用的时候即可实现新功能的展现。
共享可执行文件
在其它大部分平台上,动态库都可以用于不同应用间共享,这就大大节省了内存。从目前来看,iOS仍然不允许进程间共享动态库,即iOS上的动态库只能是私有的,因为我们仍然不能将动态库文件放置在除了自身沙盒以外的其它任何地方。
不过iOS8上开放了App Extension功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。
网友评论