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
相关产品推荐
相关产品推荐

