新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1 类的本质其实也是一个对象(类对象)
2
3 类对象
4 类对象再程序运行时一直存在
5 类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等
6 类对象所保存的信息在程序编译时确定,在第一次使用该类的时候加载到内存中
7 类对象代表类,class代表类对象,类方法属于类对象
8 如果消息的接受者是类名,则类名表示类对象
9 运行时,所有类的实例都由类对象生产,类对象会把实例的isa地值修改成自己的地址,每个实例的isa都指向该实例的类对象,
10 从类对象里可以知道父类信息、可以响应的方法等
11 类对象只能使用类方法,不能用实例方法
12
13 例:
14 Person *p = [Person new];
15 p 实例对象
16 Person 也是一个对象(类对象),是Class类型
类对象的获取
10年建站经验, 成都网站制作、成都网站建设客户的见证与正确选择。成都创新互联提供完善的营销型网页建站明细报价表。后期开发更加便捷高效,我们致力于追求更美、更快、更规范。 1 1)通过实例对象获取
2 Dog *dog =[Dog new];
3 Dog *d2 = [Dog new];
4
5 //第一种方法获取类对象 6 Class c =[dog class];
7 Clsss c2 =[d2 class];
8
9 NSLog(@"%p",c);
10 NSLog(@"%p",c2);
11
12 2)通过类名获取(类名其实就是类对象)
13
14 Class c3=[Dog class];
15 NSLog(@"%p",c3);
类对象的使用
1 原来使用类名可以做哪些事情?
2 创建对象
3 [Person new];
4 调用类方法
5 [Person test];//test是类方法 6
7 Person *p =[Person new];
8
9
10
11 c1---->Person
12
13 类对象的使用
14 Class c1 =[p class]; //Person15 1)创建实例对象
16 Person *p1= [c1 new];
17 2)调用类方法
18 [p test]; 调用的是实例方法 -动态的
19 [c1 test]调用的是类方法 +静态的
SEL类型
1 SEL:全称selector表示方法的存储位置
2
3 Person *p =[[Person allco]init];
4 [p test];
5
6 寻找方法的过程:
7 1)首先把test这个方法名包装成sel类型的数据;
8 2)根据SEL数据找到对应的方法地址;
9 3)根据方法地址调用相应的方法
10 4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用
11
12 关于_cmd:每个方法的内部都有一个_cmd,代表着当前方法
13
14 SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址就可以调用方法.这些都是运行时特征,发消息就是发送SEL,然后根据SEL找到地址,调用方法
15 //手动的把eat方法包装成SEL类型16 SEL s1 =@selector(eat);
17 //通过s1去调用了18 [p2 perfomSelector :s1];