You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发:无需子类化的ViewController类能否标记final?是否利于性能?

关于无需子类化的ViewController标记为final的问题

1. 是否可以将该类标记为final?

完全可以!在Swift中,final关键字的核心作用就是明确告知编译器和其他开发者:这个类禁止被继承。如果你的ViewController从设计之初就没有子类化的需求,也完全不打算让它成为其他类的父类,那么给它加上final修饰符是完全合规且合理的操作。举个例子:

final class ProfileViewController: UIViewController {
    // 视图控制器的业务逻辑代码
}

这么做之后,如果有人尝试继承这个类,编译器会直接抛出错误,从根源上避免了不必要的继承操作,也能清晰传递你的设计意图。

2. 标记final以获取性能收益是否合理?

这得分两方面来看:

  • 理论上的性能优势:Swift对final类的方法调用会采用静态派发(static dispatch),而普通类的方法默认是动态派发(dynamic dispatch)。静态派发不需要在运行时查找方法表,确实能减少一点运行时开销,尤其是在方法被高频调用的场景下,差异会更明显。
  • 实际开发中的性价比:但对于绝大多数ViewController来说,这点性能提升其实是微乎其微的。ViewController的生命周期方法、业务逻辑方法通常不会被高频到需要靠静态派发去优化的程度。与其纠结这点性能,不如把精力放在更影响用户体验的优化方向上——比如列表滚动流畅度、网络请求缓存、图片加载优化等。
  • 代码维护的额外价值:标记final更大的意义其实是明确设计边界,让其他开发者一眼就知道这个类不需要被继承,避免不必要的子类化操作,提升代码的可读性和维护性。如果后期需求变化需要子类化,去掉final也只是一行代码的改动,成本极低。

所以总结来说:当确定无需子类化时,将ViewController标记为final是合理的做法,但不要把它当成主要的性能优化手段,更多是作为代码设计意图的清晰声明。

内容的提问来源于stack exchange,提问作者Sagar D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:36:42