iOS高级进阶
文章平均质量分 93
在苹果的开发路上,学习和总结比较好的开发调试技能和技巧,并分享出来,和需要的朋友相互学习和探讨;包括Objective-C和Swift进阶高级开发的知识技术、提升技术、实用技巧、调试方式等,以及开发工程过程中总结出来的所遇到的问题和解决方案,共同探讨,一起进步!!
╰つ栺尖篴夢ゞ
本人毕业于计算机技术专业,从事iOS高级开发,专注于iOS/MacOS内核/汇编/源码/架构/算法等相关技术的开发学习,同时热爱人工智能、OpenGL/ES、云原生等技术,CSDN博客专家与原力计划作者,华为云云享专家与特约博主,阿里云专家博主,荣获CSDN iOS领域优质创作者、2022年度博客之星移动领域TOP 3、2022年度博客之星TOP 16、AI创想秀邂逅“华为云ModelArts”征文大赛一等奖、CSDN第一届猿创征文优质博文奖,以及多项优秀TOP博文、CSDN开源挑战赛优秀奖等。
展开
-
iOS之深入解析Xcode编译运行的原理与应用
一、前言一般可以将编程语言分为两种,编译语言和直译式语言。编译语言(Compiled language)是一种编程语言类型,通过编译器来实现。它不像解释型语言一样,由解释器将代码一句一句运行,而是以编译器,先将代码编译为机器代码,再加以运行。理论上,任何编程语言都可以是编译式,或直译式的。它们之间的区别,仅与程序的应用有关。直译语言(Interpreted language),又称直译式语言,是一种编程语言,它不需要经过编译器先行编译为机器码,之后直接在CPU中运行。相对的,编程语言需要原创 2021-08-28 19:31:03 · 11771 阅读 · 17 评论 -
iOS之深入解析如何检测“循环引用”
一、前言Objective-C 使用引用计数作为 iPhone 应用的内存管理方案,引用计数相比 GC 更适用于内存不太充裕的场景,只需要收集与对象关联的局部信息来决定是否回收对象,而 GC 为了明确可达性,需要全局的对象信息。引用计数固然有其优越性,但也正是因为缺乏对全局对象信息的把控,导致 Objective-C 无法自动销毁陷入循环引用的对象。虽然 Objective-C 通过引入弱引用技术,让开发者可以尽可能地规避这个问题,但在引用层级过深,引用路径不那么直观的情况下,即使是经验丰富的工程师,也原创 2022-04-01 20:55:18 · 49476 阅读 · 2 评论 -
iOS之从OpenGL深入探究离屏渲染及性能优化
探究内容到底什么是离屏渲染?是在GPU上面还是CPU上面执行的?为什么要有离屏渲染?什么情况下会产生离屏渲染?帧缓冲区是什么?当前屏幕缓冲区和屏幕外缓冲区又是什么?切换缓冲区是什么操作?真的比较耗时吗?OpenGL屏幕渲染方式OpenGL中,GPU屏幕渲染有以下两种方式:On-Screen Rendering:意为当前屏幕渲染,指的是GPU的渲染操作是在当前用于显示的屏幕缓冲区中进行。Off-Screen Rendering:意为离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲原创 2020-07-06 12:15:33 · 22522 阅读 · 1 评论 -
iOS之CALayer的CAEmitterLayer实现“红包雨”效果
CAEmitterLayer(粒子发生器)一、基本简介CAEmitterLayer是CALayer的一个子类,和CAEmitterCell一起使用可以创造出多样的动画效果。CAEmitterLayer主要用于实现基于Core Animation的粒子发生器系统。在粒子系统中,CAEmitterLayer负责发射粒子(当然粒子也可以发射粒子),而这些所谓的粒子,就是CAEmitterCell,我们可以将CAEmitterLayer比作是CAEmitterCell的容器,它会按照你的设置来以不同的样式原创 2020-08-04 00:30:59 · 1233 阅读 · 0 评论 -
iOS之深入探究CADisplayLink和NSTimer的对比和内存溢出问题
CADisplayLink的基本说明和使用一、什么是CADisplayLink?简单地说,它就是一个定时器,每隔几毫秒刷新一次屏幕。CADisplayLink是一个能让我们以和屏幕刷新率相同的频率将内容画到屏幕上的定时器。在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和 selector 在屏幕刷新的时候调用。一但 CADisplayLink 以特定的模式注册到runloop之后,每当屏幕需要刷新的时候,runloop就会调用原创 2020-07-29 17:29:36 · 1278 阅读 · 1 评论 -
iOS之深入解析dispatch source的原理与功能
dispatch source 和 runLoop source 都是用来监听事件的,可以创建不同类型的dispatch source和runLoop source。dispatch source 监听到事件产生时,会将 event handler 添加到目标 queue。runLoop source 需要先按照某种模式加入到指定线程的 runLoop 中。dispatch source 和 runLoop source 都是异步处理模式,只要创建、设置好,就可以在相应的 handler 中监听到相应事件的原创 2020-08-31 22:18:10 · 7054 阅读 · 3 评论 -
iOS之深入解析图片解压缩到渲染的过程与原理
一、图像从文件到显示屏幕过程① 图像显示到屏幕原理通常计算机在显示是CPU与GPU协同合作完成一次渲染。接下来了解一下CPU/GPU等在这样一次渲染过程中,具体的分工是什么?CPU:计算视图frame,图片解码,需要绘制纹理图片通过数据总线交给GPU;GPU:纹理混合,顶点变换与计算,像素点的填充计算,渲染到帧缓冲区;时钟信号:垂直同步信号V-Sync / 水平同步信号H-Sync;iOS设备双缓冲机制:显示系统通常会引入两个帧缓冲区,双缓冲机制。② 图片显示到屏幕上是CPU与GPU的协原创 2020-09-12 10:46:25 · 1569 阅读 · 1 评论 -
iOS之Xcode运行时环境变量汇总说明
变量名说明解释OBJC_PRINT_OPTIONSlist which options are set输出OBJC已设置的选项OBJC_PRINT_IMAGESlog image and library names as they are loaded输出已load的image信息OBJC_PRINT_LOAD_METHODSlog calls to class and category +load methods打印 Class 及 Category 的 + ...原创 2020-11-06 16:08:19 · 440 阅读 · 0 评论 -
iOS之LLVM编译流程和Clang插件开发集成
LLVM简介一、什么是LLVM?LLVM 是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。LLVM 最早的时候是 Illinois 的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple。Apple 目前也是 llvm 项目的主要赞助者之一。在理解 LLVM 时原创 2020-11-26 13:33:35 · 12186 阅读 · 10 评论 -
iOS之深入解析Block的使用和外部变量捕获
一、前言闭包 = 一个函数「或指向函数的指针」+ 该函数执行的外部的上下文变量「也就是自由变量」; Block是Objective-C对于闭包的实现。其中,Block:可以嵌套定义,定义Block方法和定义函数方法相似;Block 可以定义在方法内部或外部;只有调用Block时候,才会执行其{}体内的代码;本质是对象,使代码高聚合。使用 clang 将 OC 代码转换为 C++ 文件查看block的方法:在命令行输入代码 clang -rewrite-objc 需要编译的OC文件原创 2021-03-16 04:04:08 · 32263 阅读 · 10 评论 -
iOS之深入解析如何使用Block实现委托方法
一、前言Block 和 Delegate 是对象间传递消息的常用机制,这两个机制可以说是各有千秋。 Delegate 可以很方便把目标动作的执行过程划分为多个方法,以展现不同时间节点下特定的操作;Block 则擅长处理一个回调多个落点的情况,并且它可以通过捕捉上下文信息,来达到减少创建额外变量,集中消息处理逻辑的目的。结合以上两种通信方式的特点,我们可以添加一些额外的桥接处理,让 Delegate 机制也能享有 Block 机制所拥有的部分优点,桥接处理的核心就是用 Block 实现委托方法。由于原创 2022-04-01 16:00:39 · 48098 阅读 · 0 评论 -
iOS之深入解析常见密钥加密方式的原理和使用
一、前言在我们日常的iOS开发中,加密是必不可少的一部分,而普通加密方法是讲密码进行加密后保存到用户偏好设置中,钥匙串是以明文形式保存,但是不知道存放的具体位置,下面本文将详细给大家介绍iOS中常见的几种加密方法。二、base64加密① 原理原本是 8 个 bit 一组表示数据,改为 6 个 bit 一组表示数据,不足的部分补零,每两个0 用 一个 = 表示;用 base64 编码之后,数据长度会变大,增加了大约 1/3 左右;可进行反向解密;Xcode7.0 之后出现;编码有个非常显著原创 2021-03-18 19:57:47 · 6006 阅读 · 0 评论 -
iOS之深入探究多线程实现、线程安全和线程死锁
一、线程与进程① 线程与进程的定义线程线程是进程的基本执行单元,一个进程的所有任务都在线程中执行;进程要想执行任务,必须得有线程,进程至少要有一条线程;程序启动会默认开启一条线程,这条线程被称为主线程或者 UI 线程。进程进程是指在系统中正在运行的一个应用程序;每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内;通过“活动监视器”可以查看 mac 系统中所开启的线程。② 线程与进程的关系地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的原创 2021-03-24 16:20:39 · 11067 阅读 · 2 评论 -
iOS之深入分析GCD的函数与队列以及多种组合使用
一、GCD 简介① 什么是 GCD ?GCD 是 Apple 开发的一个多核编程的较新的解决方法;GCD 全称:Grand Central Dispatch,是纯 C 语言,提供非常多强大的函数;它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统;它是一个在线程池模式的基础上执行的并发任务;在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。简而言之,GCD 就是将任务添加到队列,并指定任务执行的函数;② GCD 优势GCD 是苹果公司为多核原创 2021-03-25 13:59:06 · 28116 阅读 · 0 评论 -
iOS之深入解析保证线程安全的“锁”的使用和性能分析
一、线程安全在平时的开发中经常使用到多线程,在使用多线程的过程中,难免会遇到资源竞争的问题,那么怎么来避免出现这种问题呢?当一个线程访问数据的时候,其他的线程不能对其进行访问,直到该线程访问完毕。简单来讲就是在同一时刻,对同一个数据操作的线程只有一个。只有确保了这样,才能使数据不会被其他线程影响。而线程不安全,则是在同一时刻可以有多个线程对该数据进行访问,从而得不到预期的结果。比如写文件和读文件,当一个线程在写文件的时候,理论上来说,如果这个时候另一个线程来直接读取的话,那么得到的结果可能是无法预料原创 2021-04-11 01:03:04 · 8232 阅读 · 7 评论 -
iOS之CocoaPods二进制化的实现方案
背景随着公司业务规模的增长,iOS 客户端的代码量也越来越大,编译一次项目的时间也越来越长。那么减少编译时间成了一个不得不面对的问题;随着越来越多方便的第三方组件,现在开发App基本十多个第三方依赖以上。没有build cache 或者打正式包的时候,每次基本耗时10分钟以上;现有的二进制方案如 Carthage、Rome 等都是在本地生成 framework,没法实现“一次编译,处处使用”的目标;主要原因是需要编译大量源文件(大概分为 App 和 Cocoapods 依赖库),所以把可抽离代码编原创 2020-12-30 02:53:01 · 6506 阅读 · 2 评论 -
iOS之深入解析内存管理MRC与ARC机制
一、内存管理① 什么是内存管理?当我们编写程序的时候,会声明各种各样的变量,编写各种各样的代码,它们都会占用内存,但是并不是所有的代码和内存都是由我们进行释放。内存分为5个区域:栈、堆、bss段、数据段、代码段。栈:存放的是局部变量,当局部变量的作用域结束的时候就会由系统进行释放局部变量所占用的内存空间;堆:存放的是程序员手动申请的变量,手动申请的变量可以由程序员手动编写代码进行释放;bss段:存放的是为初始化的全局变量和静态变量,当全局变量和静态变量进行初始化的时候系统就会回收他们所占用的原创 2021-05-24 21:10:09 · 28161 阅读 · 9 评论 -
iOS之深入解析内存管理NSTimer的强引用问题
一、强引用问题分析现在有两个控制器 A、B,从 A push 到 B 控制器,在 B 控制器中有如下代码: self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(popHome) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];当从控原创 2021-06-19 21:48:21 · 22666 阅读 · 1 评论 -
iOS之性能优化·优化App的启动速度
抛砖引玉苹果是一家特别注重用户体验的公司,过去几年一直在优化 App 的启动时间,特别是去年的 WWDC 2019 keynote [1] 上提到,在过去一年苹果开发团队对启动时间提升了 200%;虽然说是提升了 200%,但是有些问题还是没有说清楚,比如:为什么优化了这么多时间?作为开发者的我们,我们还可以做哪些针对启动速度的优化?所以我们今天结合 WWDC2019 - 423 - Optimizing App Launch [2] 聊一下和启动相关的东西。概念引入一、Mach-O原创 2020-11-11 04:16:35 · 32866 阅读 · 3 评论 -
iOS之性能优化·优化App的电池耗电量
一、前言在现如今的开发中,电量消耗是一个应用运行效果的一个重要的衡量标准,尤其是直播和运动应用等,设备中的每个硬件模块都会消耗电量。电量的最大消费者是 CPU,但这只是系统的一个方面,一个编写良好的应用需要谨慎地使用电能,用户往往会删除耗电量大的应用。除 CPU 外,耗电量高、值得关注的硬件模块还包括网络硬件、蓝牙、GPS、麦克风、加速计、摄像头、扬声器和屏幕等。如何降低电量的消耗,是延长使用时间的关键,因此需要关注以下几个方面:判断电池的剩余电量及充电状态;如何分析电源;原创 2021-07-06 16:06:09 · 30171 阅读 · 1 评论 -
iOS之性能优化·提高App的编译速度
一、前言经过多年的开发和迭代,我相信很多的 iOS 项目代码已经达到几十万行甚至上百万行的规模,所使用的 Pod 库的数量可以达到几十个甚至上百个,App Store 安装包也变得越来越大,在这么大的项目规模下,打包和编译问题逐步成为开发团队一个躲不过的痛,严重影响了研发效率与其他团队之间的协作。有时间,一台机器同时需要承接七八个项目,多个分支的打包任务,在有多个项目同时打包的情况,尤其显得力不从心。在硬件资源有限的情况下,并且在无侵入、无影响现有的业务的前提下,如何解决这些成为摆在团队面前的难题和原创 2021-07-06 21:42:19 · 30673 阅读 · 3 评论 -
iOS之性能优化·内置图片瘦身
一、iOS 内置资源的集中方式① 将图片存放在 bundle将图片存放在 bundle,是一种很常见的方式,项目中各类文件分类放在各个 bundle 下,项目既整洁又能达到隔离资源的目的。采用 bundle 的加载方式为 [UIImage imageNamed:“xx.bundle/xx.png”]。将图片存放在 bundle 有比较明显的缺点:iOS 系统不会对其进行压缩存储,造成了应用体积的增大;使用 bundle 存储图片放弃了 APP thinning。明显的表现是 2 倍屏原创 2021-10-19 02:30:00 · 14608 阅读 · 3 评论 -
iOS之性能优化·列表异步绘制
一、前言iOS 所提供的 UIKit 框架,其工作基本是在主线程上进行,界面绘制、用户输入响应交互等。当大量且频繁的绘制任务,以及各种业务逻辑同时放在主线程上完成时,便有可能造成界面卡顿、丢帧现象,即在 16.7ms 内未能完成 1 帧的绘制,帧率低于 60fps 黄金标准。目前常用的 UITableView 或 UICollectionView,在大量复杂文本及图片内容填充后,如果没有优化处理,快速滑动的情况下易出现卡顿,流畅性差问题。不依赖任何第三方 pod 框架,本文主要从异步线程绘制、图片异原创 2021-10-08 03:00:00 · 25590 阅读 · 3 评论 -
iOS之性能优化·UITableView深度优化
一、前言UITableView 的优化主要从四个方面入手:提前计算并缓存好高度(布局),因为 tableView:heightForRowAtIndexPath: 是调用最频繁的方法;滑动时按需加载,防止卡顿。这个在大量图片展示,网络加载的时候很管用,配合 SDWebImage;异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;缓存一切可以缓存的,这个在开发的时候,往往是性能优化最多的方向。大概需要关注的:cell 复用;cell 高度的计原创 2021-10-23 19:41:08 · 37953 阅读 · 2 评论 -
iOS之性能优化·优化App界面的渲染与流畅度
一、界面渲染流程① 渲染流程分析计算机中的显示过程通常是通过 CPU、GPU、显示器协同工作来将图片显示到屏幕上,如下图所示:苹果为了解决图片撕裂的问题使用了 VSync + 双缓冲区的形式,就是显示器显示完成一帧的渲染的时候会向发送一个垂直信号 VSync,收到这个这个垂直信号之后显示器开始读取另外一个帧缓冲区中的数据而 App 接到垂直信号之后开始新一帧的渲染。CPU 计算好显示内容,提交至 GPU;GPU 经过渲染完成后将渲染的结果放入 FrameBuffer(帧缓存区)原创 2021-07-13 19:54:06 · 12273 阅读 · 30 评论 -
iOS之深入解析WKWebView的坑点收录和优化处理
一、Cookie 处理① Cookie 说明WKWebView 在设置 Cookie 的时候,经常做的是在请求的请求头里添加 Cookie,但这只是把 Cookie 发送给了服务端,本地并没有保存 Cookie,Cookie 最终要写到 WebView 的一个 Cookie 文件目录里面,后续 WebView 里面自己的发起的请求或者跳转才能在发起请求的时候,在对应的域名下面取到 Cookie 传出去。Webview 加载 H5 页面,实际上是把页面相关的 .html、js、css 文件下载到本地,原创 2021-07-08 18:55:08 · 9714 阅读 · 0 评论 -
iOS之深入解析WKWebView的WebKit源码调试与分析
一、前言移动互联网时代,网页依旧是内容展示的重要媒介,这离不开 WebKit 浏览内核技术的支持与发展。在 iOS 平台下开发者们需要通过 WKWebView 框架来与 WebKit 打交道。虽然苹果官方提供了关于 WKWebView 的 API 与使用说明,但这并不能满足开发者们的需求,各类复杂场景依旧让我们焦头烂额,而解决方案却不易寻找。此时,优秀的开发者们将目光移向苹果开源的 WebKit 内核代码,试图从中寻找解惑之道,却发现依旧困难重重,坎坷不断,主要问题如下:内核源码复杂难懂:动辄几原创 2021-07-18 19:19:43 · 7625 阅读 · 4 评论 -
iOS之深入解析WKWebView加载的生命周期与代理方法
一、前言从 WebView 开始加载一条请求,到页面完整呈现这一过程发生了什么?无论是做 WebView 性能优化还是异常问题监控与排查,都离不开对WKWebView加载的生命周期与代理方法的剖析。在 WebKit 源码的调试基础之上, 结合 iOS 端 WKWebView 的 WKNavigationDelegate 代理方法,站在移动端的视角深入分析 WKWebView 网络请求加载的生命周期流程。WebKit 源码的调试,请参考我之前的博客:iOS之深入解析WKWebView的WebKit源码原创 2021-07-18 20:08:06 · 8086 阅读 · 0 评论 -
iOS之深入解析WKWebView的cookie管理
一、Cookie 概述在浏览内核加载网络资源的过程中,往往离不开 HTTP 协议,它是在 Web 上进行数据交换的基础,同时也是一种无状态的 client-server 协议,这种无状态的属性促使许多端存储技术产生,其中最重要的技术之一就是 cookie 存储技术,它能方便的将数据存储于客户端,且在每次请求中都会在请求头中携带 cookie 数据并发送给 server。cookie 技术的便捷性使得它在多种场景中被广泛使用,有时候甚至存在滥用情况,对同一 cookie 实例,前端、客户端、服务端都可以原创 2021-07-24 20:25:40 · 6862 阅读 · 6 评论 -
iOS之深入解析CFRunloop的多线程隐患
一、前言如果还不了解 Runloop,请参考我之前的博客:iOS之深入解析Runloop的底层原理。在苹果官方文档中,声明了 CFRunloop 是线程安全的,但是需要注意的是,Apple 使用了generally 这个模糊的词语,如下所示: Thread safety varies depending on which API you are using to manipulate your run loop. The functions in Core Foundation are gener原创 2021-07-27 19:12:02 · 3292 阅读 · 3 评论 -
iOS之深入定制基于PLeakSniffer和MLeaksFinder的内存泄漏检测工具
一、背景在编写日常业务代码时,或多或少都会引入一些导致内存泄漏的代码,而这种行为又很难被监控,这就导致应用内存泄漏的口子越开越大,直接影响到线上应用的稳定性。虽然 Xcode 的 Instrucment 提供了 Leaks 和 Allocations 工具能精准地定位内存泄漏问题,但是这种方式相对比较繁琐,需要开发人员频繁地去操作应用界面,以触发泄漏场景,所以 Leaks 和 Allocations 更加适合定期组织的大排查,作为监测手段,则显得笨重。对于内存泄漏的监测,业内已经有了两款成熟的开源工原创 2021-07-08 20:08:49 · 8552 阅读 · 3 评论 -
iOS之深入解析多环境配置的实现方案
一、多 target 形式配置多环境如下所示,选择工程 TARGETS,新创建一个 targets:创建完成后,可要发现产生了一个 plist 文件,这个 plist 就是对应新创建的 target:修改 target 名为 LoginApp-Dev,target 是一个全新生成的,因此需要修改 bundle ID,设置为 com.ydw.LoginApp-Dev,同时它也有一个自己的 plist 配置文件,也就是上面一起生成的,也修改为 LoginApp-Dev-info.plist,原创 2021-08-04 21:30:38 · 7364 阅读 · 0 评论 -
iOS之深入解析操作系统的架构
一、iOS 系统架构层次在 iOS 中,框架是一个目录,包含了共享资源库,用于访问该资源库中储存的代码的头文件,以及图像、声音文件等其它资源。共享资源库定义应用程序可以调用的函数和方法。iOS 为应用程序开发提供了许多可使用的框架,并构成 iOS 操作系统的层次架构,分为四层:Cocoa Touch 可触摸层:这一层为应用程序开发提供了各种有用的框架,并且大部分与用户界面有关,本质上来说它负责用户在 iOS 设备上的触摸交互操作。 包括:Address Book UI Framewor原创 2021-08-28 15:35:10 · 14558 阅读 · 1 评论 -
iOS之深入解析bitcode的功能与应用
一、bitcode 简介① 什么是 Bitcode ?苹果在 WWDC2015 大会上引入了 bitcode,随后在 Xcode7 中添加了在二进制中嵌入 bitcode(Enable Bitcode) 的功能,并且默认设置为开启状态。在 What is app thinning? (iOS,tvOS,watchOS) 一节中有以下定义: Bitcode is an intermediate representation of a compiled program. Apps you uploa原创 2021-08-29 16:08:22 · 17903 阅读 · 2 评论 -
iOS之深入解析App Thinning的应用瘦身优化
当前 iOS App 的编译打包方式是把适配兼容多个设备的执行文件及资源文件合并一个文件,上传和下载的文件则包含了所有的这些文件,导致占用较多的存储空间。App Thinning 是一个关于节省 iOS 设备存储空间的功能,它可以让 App Store 和操作系统在安装、更新及运行 iOS 或者 watchOS 的 App 等场景时,通过一系列的优化,尽可能减少安装包的大小,仅下载所需的资源,减少 App 的占用空间,从而节省设备的存储空间。这个过程包括了三个过程:slicing、bitcode、on-.原创 2021-08-29 19:26:24 · 18414 阅读 · 1 评论 -
iOS之深入解析App的架构设计
一、概述① 应用架构App 架构是软件设计的一个分支,它关心的是如何设计一个 App 的结构。具体来说,它关注于两个方面:如何将 App 分解为不同的接口和概念层次部件,以及这些部件之间和自身的不同操作中 所使用的控制流和数据流路径。通常使用简单的框图来解释 App 的架构,比如,Apple 的 MVC 模式可以通过 model、 view 和 controller 三层结构来描述,如下所示:在一个 MVC 项目中,绝大部分的代码都会集中其中的某个层级上。但这种简单的框图几乎无法解释在实践中原创 2021-07-24 20:36:23 · 9128 阅读 · 8 评论 -
iOS之深入解析静态库和动态库
一、库① 什么是库?库就是程序代码的集合,将 N 个文件组织起来,是共享程序代码的一种方式。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。② 库的分类根据程序代码的开源情况,库可以分为两类:开源库:源代码是公开的,可以看到具体实现,比如知名的第三方框架:AFNetworking、SDWebImage 等。闭源库:不公开源代码,只公开调用的接口,看不到具体的实现,是一个编译后的二进制文件。这种常见于一些公司的 SDK 包,比如高德地图 SDK、环信即时通讯 S原创 2021-08-31 18:23:24 · 10572 阅读 · 1 评论 -
iOS之深入解析如何构建静态库
一、.a 文件静态库打包① 打开 Xcode 创建一个新的 Static Library 工程,取名 MyStaticLibrary:② 创建工程完毕后,系统自动创建了一个同名类:添加一个方法用于测试: #import <Foundation/Foundation.h> @interface MyStaticLibrary : NSObject + (void)test; @end @implementation MyStaticLibrary原创 2021-08-30 20:32:39 · 16878 阅读 · 1 评论 -
iOS之深入解析静态Pod与动态Pod
一、静态库与动态库在项目中使用 pod 实现模块化,对于子模块和第三类库的导入方式存在两种:静态库、动态库。当在 podfile 中指定 use_frameworks! 时,子模块和第三方类库将被打包成 .framework 动态库,模块之间的代码不能直接引用,需要添加依赖;反之(默认情况)将打包成 .a 静态库:动态库和静态库的区别:资源加载方式;包的大小;编译速度。二、资源加载方式s.dependency 'xx’:静态方式中各模块的 p原创 2021-10-19 20:50:03 · 27921 阅读 · 5 评论 -
iOS之深入解析如何构建动态库与framework动态更新
一、构建步骤创建一个动态库 MyDynamicFramework:创建一个测试类:在 MyDynamicFramework.h(默认生成,可统一暴露头文件) 中 #import “Person.h”: #import <UIKit/UIKit.h> //! Project version number for MyDynamicFramework. FOUNDATION_EXPORT double MyDynamicFrameworkVersionNumber;原创 2021-08-28 02:16:57 · 23153 阅读 · 1 评论