黑马程序员技术交流社区
标题: OC学习笔记之分类(Category)延展 [打印本页]
作者: chunhuayun 时间: 2015-10-10 08:09
标题: OC学习笔记之分类(Category)延展
1、类的延展的概念
延展类别又称为【扩展Extendsion】
是Category的一个特例
其名字为匿名(空)
例如
- @interface MyClass(){//扩展
- float value;
- }
复制代码
这种写法的类别叫做【匿名类别】,又叫类扩展,所谓的扩展,其实就是一个类添加额外的成员变量,方法或者合成属性
2、延展的实现
【可以在延展中,定义实例变量】
【不能使用@implementation 类名()去实现类别的方法,要直接写在类的实现中】
例如:
【Person.h文件内容】- @interface Person : NSObject
-
- @end
复制代码
【Person_age.h文件内容】这个是延展头文件
- #import "Person.h"
-
- //分类扩展
- @interface Person(){
- int _age;
- }
- @property(nonatomic,assign) int age;
-
- -(void)printAge;//放在
- @end
复制代码
【Person.m文件内容】
- #import "Person.h"
- #import "Person_age.h"
- int main(int argc, const char * argv[])
- {
-
- @autoreleasepool {
-
- Person *p = [Person new];
- p.age = 22;
- [p printAge];
- }
- return 0;
- }
复制代码
打印结果;
2015-10-07 11:44:17.014 分类扩展[923:303] age = 22
3、延展类可以定义私有方法
【在.m文件中使用延展】
例如:
- @interface Person(){
-
- float _weight;//定义私有成员变量
- }
- @property(nonatomic,assign) float weight;
- //定义相对私有方法
- -(void)printWeight;
- @end
-
- @implementation Person
- //分类延展方法在原类的实现区实现
- -(void)printAge{
- NSLog(@"age = %d",self.age);
- }
-
- //实现私有方法,该方法只能在该文件中使用
- -(void)printWeight{
- NSLog(@"age = %.2f",self.weight);
- }
- @end
复制代码
4.类别与类扩展的区别
1)类别只能增加方法
2)类扩展不仅可以增加方法,还可以增加实例变量(或者合成属性),只是该实例变量默认类型是私有的(作用范围只能在自身类,而不是子类或其他地方)
3)类扩展中声明的方法没有被实现,编译器会报警,但是【类别】中的方法没有被实现时编译器是不会有任何警告的,这是因为【类扩展】是在编译阶段被添加到类中的,而类别是在运行时添加到类中的
4)类扩展不能像类别那样拥有独立的【实现部分@implementation部分】,也就是说,【类扩展】所声明的方法必须依托对应类的实现部分来实现
5)定义在.m文件中的类扩展方法为私有的,定义在.h文件中的类扩展方法是共有的,【类扩展】是在.m文件中声明私有方法的非常好的方式
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |