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

相关推荐
咖啡の猫5 小时前
Python字典推导式
开发语言·python
leiming65 小时前
C++ vector容器
开发语言·c++·算法
SystickInt6 小时前
C语言 strcpy和memcpy 异同/区别
c语言·开发语言
CS Beginner6 小时前
【C语言】windows下编译mingw版本的glew库
c语言·开发语言·windows
FJW0208146 小时前
Python_work4
开发语言·python
大学生资源网7 小时前
java毕业设计之儿童福利院管理系统的设计与实现(源码+)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计
JasmineWr7 小时前
JVM栈空间的使用和优化
java·开发语言
Poetinthedusk7 小时前
C#实现图片统一位深
开发语言·c#
yaoh.wang7 小时前
力扣(LeetCode) 88: 合并两个有序数组 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
吴佳浩 Alben7 小时前
Python入门指南(四)
开发语言·后端·python