一. Swift和OC的区别,为什么要引入Swift
1️⃣:语言设计与范式
OC语言基于C风格设计,同时采用Smalltalk 风格的消息传递
面向对象为主,动态运行时机制
兼容C和C++
这里简单介绍一下Smalltalk风格是什么
面向对象:一切皆对象,数值,字符串,方法等都被视为对象
消息传递:对象之间通过发送消息进行交互,而不是直接调用函数
动态类型:在运行的时候决定类型,方法绑定和对象结构,支持运行期修改
交互式环境:通常带有图形化的开发环境
简洁统一的语法
Swift是现代静态类型语言,支持面向对象、函数式编程和协议导向编程
强类型、类型推断、泛型系统更强,语法更简洁、表达力更强
静态类型语言
在编译或者类型检查期间就确定变量,表达式,函数等类型的编程语言
2️⃣ 类型和内存管理
OC依赖于ARC管理内存,并发以 GCD/NSOperation 为主,API 更底层
对于OC而言,大多数的对象都继承自NSObject,故大多数均为引用类型
Swift语言层面有更强的语法支持
强调值语义:`struct`、`enum` 是值类型(默认复制),有助于避免共享可变状态带来的并发和复杂性问题。
从 Swift 5.5 起引入 async/await、Structured Concurrency,使并发代码更直观、安全。
3️⃣ 性能:🀄️
Swift 的性能目标是接近 C++,通过静态优化和 LLVM 编译器进行优化,在很多场景下性能优于等价的 OC 实现
二、讲一讲编译和链接的过程
从源代码到目标代码的过程为:预处理 -》编译 -〉汇编 -》链接
预处理:- 处理 `#include`、`#define`、条件编译 `#if` 等指令。
汇编:把汇编文本(assembly)转换成机器代码和数据的目标文件
编译:(这里就涉及到编译原理的一些知识)
词法分析,语法分析,语义分析 =》抽象语法树 =〉中间表示
词法分析:把源代码的字符流转换为一系列记号
语法分析:把记号流组织称一个结构化的表示
语义分析:在语法正确的树基础上检查更复杂的语义规则
抽象语法树(AST):一种精简的树形结构,用来表示程序的抽象结构
中间表示:在前端(解析、语义分析)和后端(优化、目标代码生成)之间的程序表示
我们作为ios开发者,很少会在编译层做操作,一般使用的都是已有的编译器
链接:把多个目标文件和库组合成可执行文件或库,解析符号引用,完成重定位。
静态链接(static linking):将库(如 `.a`、静态库)内容复制进最终可执行文件;结果文件通常较大。
动态链接(shared/dynamic linking):可执行文件在运行时由动态链接器加载共享库(`.so`/`.dylib`/`.dll`),共享库独立更新、节省磁盘/内存,但增加运行时依赖。
一般流程为符号收集,符号解析,重定位,合并段与节
符号收集:收集所有目标文件与库中的符号定义与引用。
符号解析:- 为每个引用找到唯一的定义(或报错:未定义引用)。
重定位:计算每个引用在最终可执行中的实际地址,修正机器码/数据中的地址常量。
合并段与节:把各目标文件的 text/data/bss 合并到最终段,按平台 ABI 安排内存布局
三、synthesize & denamic
@synthesize: 告诉编译器自主实现对应的getter和setter实现
@denamic:告诉编译不要自主实现,会在运行的时候动态提供
四、介绍一下UITableView & UICollectionView
UITableView
结构特点:单列垂直滚动,数据分为Section和Row,每个cell通常都是全宽度
核心类:UITableView,UITableViewCell,UITableViewDataSource,UITableViewDelegate
Swift
class MyTableVC: UITableViewController {
let data = ["A", "B", "C"]
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
data.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.textLabel?.text = data[indexPath.row]
return cell
}
}
UICollectionView
结构特点:支持多列,网格,横向/纵向滚动,复杂自定义布局,数据分为section和item
核心类和协议:UICollectionView,UICollectionViewLayout,UICollectionViewCell,UICollectionViewDataSource,UICollectionViewDelegate
高度自定义布局(流式、瀑布流、卡片堆叠、分页)
目前如果可以的话,基本上所有的视图都建议使用UICollectionView
五、NSProxy & NSObject
NSObject:最常见的基类
提供默认的对象生命周期管理,方法响应,运行时introspection,KVC/KVO,NSCoding等基础能力
NSProxy:消息转发/代理模式
声明方法签名、转发消息;用于创建"透明代理",如远程对象代理、懒加载代理、AOP、分发到多个目标等。