当前位置: 首页 > news >正文

杭州网站建设|网站设计西安网上注册公司流程

杭州网站建设|网站设计,西安网上注册公司流程,校园网站建设网站,iis搭建网站教程App的启动流程 App启动分为冷启动和热启动 冷启动#xff1a;从0开始启动App热启动#xff1a;App已经在内存中#xff0c;但是后台还挂着#xff0c;再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段#xff1a; dyld#xff1a…App的启动流程 App启动分为冷启动和热启动 冷启动从0开始启动App热启动App已经在内存中但是后台还挂着再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段 dyld加载镜像、动态库RunTime方法main函数初始化 动态库vs静态库 静态库一堆.o文件的集合通常是.a后缀还没有被链接过缺点是产物体积比较大优点是链接到App之后体积比较小。 动态库一个已经链接完全的镜像优点是产物体积比较小缺点是链接到App之后体积比较大。 两者最大的区别就是静态库没有被链接过而动态库被链接过。 一.dyld dyld是app的动态链接器。主要可以用来装载Mach-O文件可执行文件、动态库等 启动APP时dyld所做的事情有 加载过程从exec()函数开始这是一个系统调用。操作系统首先为进程分配一段内存空间。然后执行以下操作 1.把App的可执行文件加载到内存2.把dyld加载到内存3.dyld进行动态链接 具体内容 1、加载动态库 Dyld从主执行文件的header获取到需要加载的所依赖动态库列表然后它需要找到每个 dylib而应用所依赖的 dylib 文件可能会再依赖其他 dylib所以所需要加载的是动态库列表一个递归依赖的集合 2、Rebase和Binding 1、Rebase偏移修正        任何一个app生成的二进制文件在二进制文件内部所有的方法、函数调用都有一个地址这个地址是在当前二进制文件中的偏移地址。一旦在运行时刻即运行到内存中每次系统都会随机分配一个ASLRAddress Space Layout Randomization地址空间布局随机化地址值是一个安全机制会分配一个随机的数值插入在二进制文件的开头例如二进制文件中有一个 test方法偏移值是0x0001而随机分配的ASLR是0x1f00如果想访问test方法其内存地址即真实地址变为 ASLR偏移值 运行时确定的内存地址即0x1f000x0001 0x1f01 2、Binding绑定        例如NSLog方法在编译时期生成的mach-o文件中会创建一个符号NSLog目前指向一个随机的地址然后在运行时从磁盘加载到内存中是一个镜像文件会将真正的地址给符号即在内存中将地址与符号进行绑定是dyld做的也称为动态库符号绑定一句话概括绑定就是给符号赋值的过程 二.RunTime阶段 dyld阶段结束之后就进入RunTime阶段这个阶段主要进行如下内容 1、Objc setup 1、注册Objc类 (class registration)2、把category的定义插入方法列表 (category registration)3、保证每一个selector唯一 (selector uniquing) 2、Initializers 1、Objc的load()函数2、C的构造函数属性函数3、非基本类型的C静态全局变量的创建(通常是类或结构体) 三.main()函数初始化 App的启动由dyld主导把可执行文件加载到内存并且加载所有依赖的动态库并由RunTime负责加载成objc定义的结构所有初始化工作结束后dyld就会调用mainn函数 接下来就是UIApplicationMain函数AppDelegate的application:didFinishLaunchingWithOptions:方法 这个里面往往是最占用启动时间的地方同时也是我们最为可控的地方。 • 进入 main() 函数启动应用。 • 执行 UIApplicationMain() 函数创建 UIApplication 对象并设置 AppDelegate。 • 加载应用的主 UI包括 storyboard 或 xib 文件以及 AppDelegate 的各种生命周期方法如 application:didFinishLaunchingWithOptions:。 四.首屏渲染阶段 初始化rootViewController加载和渲染界面 渲染完成后用户将看到应用的首屏。 App冷启动流程总结 1. dyld 加载阶段 • 动态链接器 dyld 负责加载应用的可执行文件及其依赖的动态库。此时系统将会做如下工作 • 查找应用的可执行文件和动态库 • 将它们加载到内存中 • 进行符号解析和绑定 • 执行初始化函数如 load 方法和静态构造函数 2. runtime 初始化阶段 • ObjC 运行时对类和分类进行注册。 • 执行各类 load 方法这个阶段还会进行一些 Swift 类的初始化。 3. main() 函数执行阶段 • 进入 main() 函数启动应用。 • 执行 UIApplicationMain() 函数创建 UIApplication 对象并设置 AppDelegate。 • 加载应用的主 UI包括 storyboard 或 xib 文件以及 AppDelegate 的各种生命周期方法如 application:didFinishLaunchingWithOptions:。 4. 首屏渲染阶段 • 初始化 rootViewController加载和渲染界面。 • 渲染完成后用户将看到应用的首屏。 load与initialize 1、load 1load方法是一定会在runtime中被调用的。只要类被添加到runtime中了就会调用load方法因此load方法总是在main函数之前调用。 2load方法不会覆盖。也就是说如果子类实现了load方法那么会先调用父类的load方法无需手动调用super然后又去执行子类的load方法。 3load方法只会调用一次。 4load方法执行顺序是类 - 子类 -分类。而不同分类之间的执行顺序不一定依据在Compile Sources中出现的顺序先编译则先调用列表中在下方的为“先”。 5load方法是函数指针调用即遍历类中的方法列表直接根据函数地址调用。如果子类没有实现load方法子类也不会自动调用父类的load方法。 2、initialize 1initialize方法是在类或它的子类收到第一条消息之前被调用的这里所指的消息包括实例方法和类方法的调用。因此initialize方法总是在main函数之后调用。 2initialize方法只会调用一次。 3initialize方法实际上是一种惰性调用如果一个类一直没被用到那它的initialize方法也不会被调用这一点有利于节约资源。 4initialize方法会覆盖。如果子类实现了initialize方法就不会执行父类的了直接执行子类本身的。如果分类实现了initialize方法也不会再执行主类的。 5initialize方法的执行覆盖顺序是分类 - 子类 -类。且只会有一个initialize方法被执行。 6initialize方法是发送消息objc_msgSend()如果子类没有实现initialize方法也会自动调用其父类的initialize方法。 3、两者的异同 1相同点 load和initialize会被自动调用不能手动调用它们。子类实现了load和initialize的话会隐式调用父类的load和initialize方法。load和initialize方法内部使用了锁因此它们是线程安全的。 2不同点 调用顺序不同以main函数为分界load方法在main函数之前执行initialize在main函数之后执行。存疑子类中没有实现load方法的话子类不会调用父类的load方法而子类如果没有实现initialize方法的话也会自动调用父类的initialize方法。load方法是在类被装在进来的时候就会调用initialize在第一次给某个类发送消息时调用比如实例化一个对象并且只会调用一次是懒加载模式如果这个类一直没有使用就不回调用到initialize方法。 4、使用场景 1load一般是用来交换方法由于它是线程安全的而且一定会调用且只会调用一次通常在使用UrlRouter的时候注册类的时候也在load方法中注册。 2initialize方法主要用来对一些不方便在编译期初始化的对象进行赋值或者说对一些静态常量进行初始化操作。 冷启动时间优化 1.减少动态库dyld阶段 一般不多于6个多余需要进行合并动态库越多dyld阶段加载时间越长。 2.减少类和方法的数量 3.延迟初始化rebase/Binging阶段 尽量延迟一些不必要的初始化工作不要在启动时立即初始化所有对象。可以使用懒加载将一些初始化放到用户需要时再进行以减轻启动阶段的负担。 4. 避免 load 方法的使用Initializers阶段 load 方法会在 dyld 加载阶段执行建议用 initialize 或者在合适的地方延迟执行初始化逻辑避免阻塞启动流程。 5.优化 AppDelegatemain阶段 application:didFinishLaunchingWithOptions: 方法应保持精简避免在这里进行耗时的操作。将一些耗时任务放到后台队列中异步执行。 6.减少主线程阻塞 启动阶段尽量避免主线程的耗时操作如文件 I/O、网络请求等。将这些操作放到子线程处理以免阻塞界面渲染。 7.预编译和瘦身 移除未使用的代码、图片等资源精简应用的体积从而减少加载时间。 尽量减少 storyboard 的使用尤其是大而复杂的 storyboard可以分解成多个小的 storyboard 或者使用纯代码实现界面。 8.启动时的网络请求 尽量避免在启动时进行同步的网络请求如果必须请求可以在启动完成后或在后台进行异步请求以减少对启动时间的影响。   参考 iOS--App启动过程及优化_ios启动优化-CSDN博客 https://juejin.cn/post/6951591401528229895?searchId202502182003101C89E818EB9B45117D0A JHBlog/iOS知识点/iOS大杂烩/APP启动优化/App启动时间优化.md at master · SunshineBrother/JHBlog · GitHub
http://www.w-s-a.com/news/7573/

相关文章:

  • 网站建设员工技能要求网站制作简单协议
  • 没有ipc备案的网站wordpress isux主题
  • 清远做网站电子商务网站建设需要的语言及特点6
  • 万州那家做网站c语言基础知识入门
  • 齐河网站建设公司价格网站建设包括什么
  • 论坛网站开发费用怎么把文件放到网站的根目录
  • 海南省零售户电商网站官渡区住房和城乡建设局网站
  • 怎么找淘宝客网站最新军事战况
  • 缺乏门户网站建设网页设计与制作项目教程第二版
  • 手机网站横竖屏一般做建设的是什么公司
  • 免费网站建设无广告网站开发 华景新城
  • 湖州网站制作报价西安网站开发有哪些公司
  • google 浏览器开源seo软件
  • 网站空间是什么意思自己怎样建设网站
  • 国外家装设计网站如何做软件开发
  • 凡科建站登录官网当当网网站建设策划书
  • 网站百度屏蔽关键词杭州排名优化公司
  • h5响应式网站模板下载wordpress鼠标指针
  • 摄影作品投稿网站目前最好的引流推广方法
  • 资源站源码永久dede网站搬家 空间转移的方法
  • 网站建设销售的技巧话语it培训机构
  • 自建本地网站服务器wordpress南充房产网最新楼盘最近房价
  • 郑州代做网站天津哪里能做网站
  • 网站如何做排名网站建设项目的工作分解
  • 洛阳网络建站公司网站开发主流语言
  • 广州各区正在进一步优化以下措施seo值是什么意思
  • 滨州建网站公司京东云 wordpress
  • 网站视频背景怎么做免费的网络推广有哪些
  • 申请网站怎样申请广西壮族自治区专升本业务系统
  • 写作网站哪个网站做ic外单好