返回
学习 iOS 2021 面试点,提前备战,勇夺 offer!
IOS
2024-02-17 21:21:24
好的!我已经准备好了要为你写一篇关于iOS 2021 面试前的准备(总结各知识点方便面试前快速复习使用)(八) 的文章。
extension 与 category 区别
extension 与 category 都是用来给已有类扩展新功能的一种方法。它们的主要区别在于:
- 扩展成员变量: extension 可以添加成员变量,而 category 不能添加成员变量。这是因为 extension 是在编译时将新代码加入到现有类中,而 category 是在运行时将新代码添加到现有类中。在运行时加载类到内存以后,才会加载分类,这时类的内存布局已经确定(编译器还会对成员变量顺序做出优化,保证遵循内存对齐原则下类占用内存容量最少),如果添加成员变量会破坏类的内存布局,导致程序崩溃。
- 加载顺序: extension 在编译时加载,而 category 在运行时加载。这意味着 extension 可以访问类中所有成员,包括私有成员,而 category只能访问类中公开的成员。
- 命名空间: extension 可以声明一个新的命名空间,而 category 不能声明新的命名空间。这意味着 extension 中的方法和属性可以与类中现有的方法和属性具有相同的名称,而 category 中的方法和属性不能与类中现有的方法和属性具有相同的名称。
扩展的应用场景
extension 可以用来:
- 添加新方法和属性: 这可以通过扩展一个现有类或协议来实现。例如,我们可以给
String
类型添加一个isPalindrome
方法,该方法返回一个布尔值,指示字符串是否是回文。 - 实现新的协议: 这可以通过扩展一个现有类或结构体来实现。例如,我们可以让
UIView
类实现UIGestureRecognizerDelegate
协议,从而允许它响应手势。 - 修改现有方法的行为: 这可以通过扩展一个现有类或结构体来实现。例如,我们可以扩展
Array
类型,让它可以像 Python 中的列表一样使用。
分类应用场景
category 可以用来:
- 添加新方法和属性: 这可以通过扩展一个现有类来实现。例如,我们可以给
UIButton
类添加一个setBackgroundColor
方法,该方法允许我们设置按钮的背景色。 - 实现新的协议: 这可以通过扩展一个现有类或结构体来实现。例如,我们可以让
UIViewController
类实现UIAlertViewDelegate
协议,从而允许它响应警报视图的委托方法。 - 修改现有方法的行为: 这可以通过扩展一个现有类或结构体来实现。例如,我们可以扩展
String
类型,让它可以像 Python 中的字符串一样使用。
总结
extension 和 category 都是用来给已有类扩展新功能的两种方法。extension 可以添加成员变量,category 不能添加成员变量。extension 在编译时加载,category 在运行时加载。extension 可以声明一个新的命名空间,category 不能声明新的命名空间。
希望这篇文章对您有所帮助。如果您有其他问题,请随时告诉我。