iOS的分类 和 扩展的区别
分类(类别)
- 分类也叫类别,对于一个我们可以它进行方法扩充,一般来说添加一个子类就可以达到目的,iOS提供了 类别为现有类添加新的方法,并且不需要创建子类
Xcode创建一个分类
-
1) 点开一个文件 点击New File ,选择iOS的OC File
-
-
2)创建类别
-
- 在FIle 哪一行写上类别名字,第二行选择 Categroy(类别) 第三行是要被添加的类,即可创建
- 在FIle 哪一行写上类别名字,第二行选择 Categroy(类别) 第三行是要被添加的类,即可创建
-
3)完成创建
分类的注意
- 分类只能添加新的方法,但是不能添加属性(成员变量),我们尝试添加成员变量
-
Property 'age1' requires method 'setAge1:' to be defined - use @dynamic or provide a method implementation in this category属性“age1”需要定义方法“setAge1:”—请使用@dynamic或在此类别中提供方法实现
-
Property 'age1' requires method 'age1' to be defined - use @dynamic or provide a method implementation in this category 属性“age1”要求定义方法“age1”-使用@动态或在此类别中提供方法实现
这个警告只是需要我们给 用@property关键字 添加的属性手动完成setter getter方法,但是当我们在写setter getter方法的时候一旦涉及到我们在类别定义的属性的时候就会报错
-
-
Use of undeclared identifier 'age1'
-
- 可以在分类中访问原有的 类的属性
- 如果分类有和原来类同名的方法,会优先调用分类的方法。优先级是分类大于 本类 大于 父类
-
如果多个分类中都有和原有类同名的方法,那么调用该用法的时候执行谁由编译器决定,编译器会执行最后一个参与编译的分类中的方法。
拓展
Xcode创建拓展
和类别的区别就是 在第二行选择Extension 其他的不变
扩展的作用
- 可以为待扩展的类添加额外的 属性 变量 和方法生命
-
- 注意私有属性写在类扩展
- 扩展可以添加属性和成员变量
- 扩展是本身没有自己的实现的,它和本类共享一个实现
区别和联系
- 类别和扩展都可以为 原来的类添加新的方法,但是类别的方法不实现系统不会提供警告,扩展的方法不提供实现 系统会提示警告
-
原因是分类在运行的时候就被添加到类中了,扩展在编译的时候阶段被添加到类中
- 类别数不被允许添加成员变量和属性的,但是扩展可以。
- 类别有自己的实现部分,但是扩展却没有自己的实现部分,需要和本类一起实现