【OC语言】第四篇·类的继承、多态、类对象以及SEL类型

来源:互联网 发布:恒生指数期货模拟软件 编辑:程序博客网 时间:2024/06/12 01:50
一、self和super
    1. OC中两个保留字self和super,用于在方法定义中引用该方法的对象。
    2. super发送消息可以将方法实现分发其父类,可以重写一个已有的方法来修饰或将它添加到现有的方法中,仍然可以将原始的方法纳入到修改后的方法中。
    3. self的应用场景:
       1)用在类方法中:指代当前类(可以用 [对象名 class]  输出当前类地址)
       2)用在对象方法中:指代的是调用当前方法的对象。
       3)访问成员变量。
       4)self在OC的内存管理特殊使用。
    4. self在对象方法中,可以利用self ->属性名称的方式访问成员变量。
        应用场景:当存在局部变量名和成员变量名相同的时候。
        注意:如果成员变量名和方法形参名同名,则局部变量会屏蔽成员变量的作用域。

二、类的继承和派生
    1. 子类(派生类)获得父类(基类)的特性就是继承。
    2. 基类和派生类的关系
         派生类方法属性 = 基类方法属性 + 派生类自己新增的方法和属性
    【OC语言】第四篇·类的继承、多态、类对象以及SEL类型 - 枫叶 - 枫叶的博客
     3. 注意
        1)基类的私有属性能被继承,不能被使用。
        2)OC中的继承是单继承:也就是说一个类只能有一个父类,不能继承多个父类。
        3)继承的合理性
    4. 重写:把父类的方法,在子类的@implementation中重新给实现
    5. 继承的注意事项:
      1)子类不能定义和父类同名的成员变量。
      2)OC支持单一继承,不支持多继承
      3)OC支持多层继承。

三、实例变量修饰符
    1. @public:公开的,在任何地方通过实例对象都可以访问
    2. @private:私有的,表示只能在当前类中使用
    3. @protected:受保护的,表示只能在当前类和子类当中使用
    4. @private 修饰的成员变量可以被子类继承,但是不能被子类访问。
    5. 实例变量默认是protected类型。
    6. 在类的实现即.m文件中也是可以声明成员变量,但是因为在其它文件中,通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量都是@private的。

四、description
    1. 当我们以%@的格式,输出对象时,此时调用了对象的description方法,对象中如果没有重写父类的description方法,则调用父类。
    2. 对象的description方法
       -(NSString *)description{
           return [NSString stringWithFormat:@"成员变量信息",成员变量列表];
        }
    3. 类的description方法
         +(NSString *)description{
               return @"+开头的方法";
          }
    4.description陷阱
        千万不要再description方法中同时使用%@ 和self。如果同时使用,代表了要调用self的description方法,因此会导致程序陷入死循环。

五、多态
    1. 程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态。
    2. 多态的条件:有继承关系、有方法的重写,父类的声明变量指向子类对象。即:用父类类型的指针指向了子类对象。
    3. 多态的优点:
      多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口就是一些抽象的行为集合,从而实现接口的类的区分开来。 
    4. 多态原理
      1)动态绑定:动态类型能够使程序直到执行时才确定对象所属类型。
                                动态类型绑定能使 程序知道执行时才确定要对对象调用的实际方法
                               OC不同于传统程序设计语言,它可以再运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载
                               id类型:通用指针类型,弱类型,编译时不进行类型检查
    5.注意:
      1)如果存在多态,父类是可以访问子类特有的方法。
            例如:Animal *a = [Dog new];   [(Dog *) a bark] ; //把父类的指针强制类型转换
      2)如果不存在多态,父类是不可以访问子类特有的方法。
            例如:Animal *a2 = [Animal new];  [(Dog *) a2 bark];  //错误

六、类的本质
    1. 类的本质其实也是一个对象(类对象)。
    2. 类对象:
        类对象在程序运行是一直存在
        类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等。
        类对象所保存的信息在程序编译时确定,在第一次使用该类的时候被加载到内存中。
        类对象代表类,class代表类对象,类方法属于类对象
        如果消息的接受者是类名,则类名代表类对象
        运行时,所有类的实例都由类对象生成,类对象会把实例的isa的值修改成自己的地址,每个实例的isa都指向该实例的类对象
        从类对象那里可以知道父类信息,可以响应方法
        类对象只能使用类方法,不能要实例方法
    3. 类对象的获取
        Dog *dog = [Dog new];
        通过对象来获取:Class c = [dog class];
        通过类名来获取: Class c1 = [Dog class];

七、SEL类型
    1. SEL:全称selector表示方法的存储位置
    2. Person *p = [[Person alloc] init];
        [p test];
        寻找方法的过程:
        1)首先把test这个方法名包装成SEL类型数据
        2)根据SEL数据找到对应的方法地址
        3)根据方法地址调用相应的方法
        4)在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。
    3. SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后,可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

八、类对象的存储细节
   【OC语言】第四篇·类的继承、多态、类对象以及SEL类型 - 枫叶 - 枫叶的博客
0 0