秋招ios面试 -- 真题篇(一)

一. Swift和OC的区别,为什么要引入Swift

1️⃣:语言设计与范式

OC语言基于C风格设计,同时采用Smalltalk 风格的消息传递

面向对象为主,动态运行时机制

兼容C和C++

这里简单介绍一下Smalltalk风格是什么

  1. 面向对象:一切皆对象,数值,字符串,方法等都被视为对象

  2. 消息传递:对象之间通过发送消息进行交互,而不是直接调用函数

  3. 动态类型:在运行的时候决定类型,方法绑定和对象结构,支持运行期修改

  4. 交互式环境:通常带有图形化的开发环境

  5. 简洁统一的语法


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、分发到多个目标等。

相关推荐
八月的雨季 最後的冰吻1 小时前
FFmepg--29- C++ 音频混音器实现
开发语言·c++·音视频
拾光Ծ1 小时前
“异常”处理机制 与 C++11中超实用的 “智能指针”
java·开发语言·c++·安全
枫叶丹41 小时前
【Qt开发】Qt窗口(五) -> 非模态/模态对话框
c语言·开发语言·数据库·c++·qt
几何心凉1 小时前
从全密态到AI运维:openGauss构建企业级数据安全与效率的双重屏障
开发语言·数据库
思茂信息2 小时前
CST软件对Customer Success OPPO手机电源适配器EMC仿真
开发语言·嵌入式硬件·matlab·3d·智能手机·cst
缺点内向3 小时前
如何在 C# 中将 Excel 工作表拆分为多个窗格
开发语言·c#·.net·excel
少废话h4 小时前
解决Flink中ApacheCommonsCLI版本冲突
开发语言·python·pycharm
天命码喽c4 小时前
GraphRAG-2.7.0整合Milvus-2.5.1
开发语言·python·milvus·graphrag
后端小张4 小时前
【JAVA进阶】Spring Boot 核心知识点之自动配置:原理与实战
java·开发语言·spring boot·后端·spring·spring cloud·自动配置