2025-9月面试题

1.分类和代理添加属性区别
代理添加属性:通常用于管理代理对象的状态或相关信息。代理本身是设计用于通信和事件传递的,不是用于存储数据。你可以在代理类中自由地添加属性,通常是用于管理和传递数据。
分类添加属性:分类不能直接添加存储属性,只能通过 关联对象 来实现模拟属性的效果。分类主要用于扩展已有类的功能,不改变类的本身实现
2.swift throw 和 rethrows区别
特性 throw rethrows
作用 用于函数内部抛出错误 用于函数接受闭包参数,且只有在闭包抛出错误时,才抛出错误
用法 需要 throws 关键字修饰函数,直接抛出错误 需要 rethrows 关键字修饰函数,只有闭包抛出错误时才会抛出错误
调用时机 调用者必须处理错误(使用 try 和 do-catch) 调用时,如果闭包没有抛出错误,就不需要处理错误
是否必须抛出错误 总是抛出错误 仅当传入的闭包抛出错误时才抛出错误

throw 是用于直接抛出错误的关键字。
rethrows 是一个特定的关键字,表示函数接受一个可能抛出错误的闭包,并且函数本身只有在闭包抛出错误时才会抛出错误。
3.swift Actor作用
actor 在 Swift 中的主要作用是 管理并发环境下的共享状态,通过串行化访问来确保数据的一致性和线程安全。它通过自动管理并发访问的排队机制,简化了并发编程中的错误处理,避免了手动管理锁等同步机制,尤其适用于需要保护共享状态的场景。
actor 用于并发编程,保证共享数据的线程安全。
访问 actor 内部数据需要通过异步方法,并使用 await 关键字。
actor 自动确保对其内部数据的串行访问,避免了传统并发编程中的竞态条件。

let counter = Counter()

// 创建多个并发任务
Task {
    await counter.increment()
}

Task {
    await counter.increment()
}

Task {
    let value = await counter.getValue()
    print("Final value: \(value)") // 输出 2
}
  1. Swift 中,AssociatedType 和泛型(Generics) 区别
    泛型:适用于函数、类、结构体等地方,允许你在编写代码时抽象出类型,使用时才指定具体类型。
    关联类型:专门用于协议中,用来在协议中声明占位符类型,具体的类型会在实现协议时确定。


    8d8efaf2-8fb9-4360-a112-d7a8482dcc67.png

    5.CTMentor、URL-Block 和 Protocol-Class 组件化

1.CTMentor 是专为大规模 iOS 应用开发而设计的组件化框架,目标是提高开发过程中的模块化管理和自动化集成。它的主要特点包括:

自动化管理模块依赖:CTMentor 提供自动化的依赖管理,减少手动配置复杂度。
模块解耦:CTMentor 强调模块之间的最小依赖,通过清晰的接口和协议来解耦各个模块。
动态组件加载:它支持在运行时根据需要加载或卸载模块,有助于优化资源管理。
集成测试支持:它还提供了自动化测试功能,确保模块间的兼容性。

  1. URL-Block
    URL-Block 是另一种组件化方式,通常用于网络请求和模块间的导航管理。它的设计思路是将应用中的 URL 请求封装为“URL-Block”形式,从而在不同的模块间共享资源。

通过 URL 处理请求:URL-Block 使用 URL 来标识各个模块的入口,通过动态路由跳转来进行模块间的访问。
模块间隔离:通过 URL 路由,模块之间相对独立,不直接依赖其他模块的实现。
简化跨模块通信:使用 URL 和 Block 作为通信桥梁,减少了各模块间的直接耦合。

  1. Protocol-Class
    Protocol-Class 是通过协议和类来实现组件化的一种设计方式,主要侧重于通过协议来定义模块的接口,类则实现这些协议。

协议定义接口:通过协议定义模块之间的接口,使得模块实现与具体的类解耦。
类实现协议:具体的实现类会遵循协议的要求,完成模块的具体功能。
可插拔设计:因为协议定义了模块之间的接口,不同的类可以替换实现,保证了模块的灵活性和可扩展性。


screenshot-20250904-191736.png

6.RxSwfit
7.响应式和函数式区别
“函数式编程关注用纯函数和不可变数据来组合/变换数据,尽量把副作用隔离开,比如先算出 UI 需要的 state,再渲染到界面;响应式编程关注随时间变化的事件和异步数据,把它们建模成流,用 RxSwift/Combine 的订阅和操作符(debounce、merge、switchLatest 等)来持续驱动 UI 更新。”
8.OC和Swift混编问题
9.runtime反射
10.为什么oc是动态语言
11.OC对象可以为空吗,还是返回空
OC 里对象指针可以为 nil,给 nil 发消息不会 crash,会返回 0/nil/NO 这类默认值
12.inout 和 mutating 的区别
inout:让函数修改传入的参数变量(调用方加 &)。

mutating:让值类型的方法修改自身 self(struct/enum 专用)
13.Swift里的关键字

 let / var:常量 vs 变量(能不能重新赋值)。

class / struct:引用类型 vs 值类型(拷贝语义不同)。

enum:枚举,可带关联值/原始值。

protocol:协议抽象;配合 extension 做默认实现。

extension:扩展类型能力(不能加存储属性)。

guard:提前返回,减少嵌套(条件不满足就退出)。

defer:作用域结束必执行(资源释放/收尾)。

optional(T?)/ nil:可能为空;用 if let/guard let 解包。

as / is:类型转换与类型判断。

inout:函数内可修改外部变量(调用处加 &)。

mutating:struct/enum 方法里允许修改 self。

throws / try / catch:错误抛出与捕获;try? 转 optional。

lazy:懒加载,首次使用才初始化。

weak / unowned:弱引用/无主引用,解决循环引用。

final:禁止继承/重写(也有利于优化)。

override:重写父类方法/属性。

@escaping:闭包逃逸(异步回调常见)。

@objc / dynamic:暴露给 ObjC runtime;KVO/swizzle 常用。

async / await:结构化并发的异步调用。

actor:并发安全的状态隔离(内部访问串行化,需要 await)。

14.SwiftLint怎么用
SwiftLint 是 Swift 的代码规范与静态分析工具,通过规则配置在编译前检查代码风格和常见问题,提升代码一致性和质量,减少 review 成本
15.oc问 反射 和 swift反射
区别主要在于动态能力强弱。OC 的 runtime 反射依赖 Objective-C runtime,可以获取类、属性、方法,还能动态添加方法、方法交换、消息转发和关联对象,所以它更像“运行时编程”;Swift 的反射主要是 Mirror,更偏向查看实例的属性和值,支持 struct、enum、class 等类型,但能力更弱,基本是只读的,主要用于调试和辅助工具,不会像 OC runtime 那样直接改运行时行为
16.combine
17.协议区别
OC 协议偏运行时动态接口,支持 optional,靠消息发送;Swift 协议是类型系统核心,支持默认实现、泛型约束、associatedtype/Self,既能给 class 用也能给 struct/enum 用,派发机制可静态优化;如果标记 @objc 才会退回 OC runtime,但会失去 associatedtype 等能力
18,block 闭包区别 { (x: Int) in ... }
Swift 的闭包和 OC 的 block 都是可传递的函数对象,用于回调。区别是 Swift closure 是语言一等公民,类型系统更强,并且有 @escaping 来区分是否会逃逸,捕获变量用 capture list(比如 [weak self])很直接;OC block 是对 C 的扩展,本质也是对象,修改外部变量常要 __block,避免循环引用通常用 weak/strong dance。两者都可能产生 retain cycle,需要注意捕获 self 的方式。”
二面:
1、问我架构 怎么搭建
2、埋点自己怎么实现
3、问了购物车逻辑,存数据库啊,几个存储方式应用场景,realm数据库,OC就是FMDB
4、tableView优化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容