一、类的本质
1、类的本质
类的本质其实也是一个对象(类对象),是Class类型
【类对象】
1)类对象在程序运行时一直存在
2)类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本信息,以及消息和函数的映射表等
2、类对象如何获取
1)通过实例对象获取
例如:
Animal *ani = [Dog new];
Animal *ani2 = [Dog new];
Class ac = [ani class];
Class ac2 = [ani2 class];
NSLog(@"ac = %p", ac);
NSLog(@"ac2 = %p", ac2);
NSLog(@"Dog = %p", [Dog class]);
打印结果:
2015-10-04 22:38:57.712VariableClass[2302:303] ac = 0x100001330
2015-10-04 22:38:57.714VariableClass[2302:303] ac2 = 0x100001330
2015-10-04 22:38:57.716VariableClass[2302:303] ac2 = 0x100001330
2)通过类名获取
见1)中 NSLog(@"Dog = %p", [Dog class]);
3、类对象的使用
例如:
Animal *ani = [Dog new];
Class ac = [ani class];
Dog *dog = [ac new];
[dog bark];
打印结果:
2015-10-04 22:43:38.948 VariableClass[2355:303] Wangwang...
分析结果:
可知类对象ac可以当Dog类用,可以创建Dog实例对象
二、SEL类型
SEL:全程selector表示方法的存储位置
寻找方法的过程:
1)先把方法封装成一个SEL类型的数据
2)根据SEL数据找到对应的方法地址
3)根据方法地址调用相应的方法
4)【注意】在这个操作过程中有缓存,第一次找得时候是一个一个的找,非常消耗性能,之后再用到的时候就直接使用。
【注意】SEL其实是对方法的一种包装,将方法包装秤一个SEL类型的数据,去寻找对应的方法地址,找到方法地址就可以调用方法,这些都是运行时的特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。
例如:
Dog *dog = [Dog new];
[dog bark];
SEL sel = @selector(bark);
[dog performSelector:sel];
打印结果:
2015-10-04 23:02:58.856 VariableClass[2437:303] Wangwang...
2015-10-04 23:02:58.859 VariableClass[2437:303] Wangwang...