黑马程序员----Objective-C学习笔记之类的本质与SEL类型

------Java培训、Android培训、iOS培训、.Net培训--------

一、类的本质

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...


你可能感兴趣的:(Objective-C基础)