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

相关推荐
源代码•宸14 分钟前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
Anastasiozzzz23 分钟前
Java Lambda 揭秘:从匿名内部类到底层原理的深度解析
java·开发语言
刘琦沛在进步27 分钟前
【C / C++】引用和函数重载的介绍
c语言·开发语言·c++
机器视觉的发动机38 分钟前
AI算力中心的能耗挑战与未来破局之路
开发语言·人工智能·自动化·视觉检测·机器视觉
HyperAI超神经1 小时前
在线教程|DeepSeek-OCR 2公式/表格解析同步改善,以低视觉token成本实现近4%的性能跃迁
开发语言·人工智能·深度学习·神经网络·机器学习·ocr·创业创新
马猴烧酒.1 小时前
【面试八股|JVM虚拟机】JVM虚拟机常考面试题详解
jvm·面试·职场和发展
R_.L1 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
Zach_yuan1 小时前
自定义协议:实现网络计算器
linux·服务器·开发语言·网络
云姜.1 小时前
java多态
java·开发语言·c++
CoderCodingNo1 小时前
【GESP】C++五级练习题 luogu-P1865 A % B Problem
开发语言·c++·算法