本帖最后由 仰望星空的猪 于 2015-11-27 10:44 编辑
1 多态 多态:某一类事物的多种形态。 程序中多态:不同的对象以自己的方式响应相同的方法的能力。每个对象都可以有自己的同名方法。 多态的条件 有继承关系,有同名方法的重写。 基类 * 对象名=[子类 new];//父类的指针指向子类的对象。 多态的优点 简化编程借口。容许类和类之间的同名方法。 多态的实现 1) 基类定义方法并实现(-run()) 2) 派生类重写父类的同名方法(-run()) 3) 父类指针指向子类对象 基类 * 对象名=[子类 new]; 4) 父类指针调用子类方法 [对象名 方法]; 多态的原理 动态类型可以使直到程序运行时才确定对象所属的类型。 动态类型绑定能使程序执行时才确定对象调用的实际方法。 注意 存在多态时,父类可以访问子类特有方法。需要强制类型转换。将父类指针类型转换为子类指针类型。 2 类的本质 类的本质还是类(类对象)。是另外一个类的对象。 类对象是一种数据结构,存储的是类的基本信息:类大小,类名,类版本以及消息与函数的映射表。 类对象代表类。 class代表类对象,类方法属于类对象。 Person *p =[Person] p 是Person实例对象 Person 是class类的类对象 类对象获取 1) 通过实例对象获取 Class c=[p class]; Person 2) 通过类名对象 Class c =[ Person class]; 类对象的使用 可以创建对象 Person *p= [c new]; c可以当Person用 可以调用类方法 3类对象的存储 类对象(Person)也在堆区存储。_isa指向代码区。 实例对象(p)_isa 指向类对象的地址。 P指向类对象。 SEL 对方法的包装,表示方法的存储位置。 1) 当实例对象调用方法的时候会把这个方法包装成SEL类型的数据 2) 根据SEL找到对应的方法地址。 3) 根据方法地址调用方法。 使用 Person *p=[Person new]; // Person类中有方法 –eat()
SEL sel =@selectot(eat); [ p performSelector :sel ]; //响应方法
|