• IOS


    1. 多态性

    多态性是个生物名词,用来表示生物体在生命周期中的不同形态,用在编程语言中则表示相同的方法名,但是却有不同的实现方式。或者说相同的名字,不同的类。我们来看一个书上的示例:

    1. #import <Foundation/Foundation.h>  
    2. //定义类 A  
    3. @interface A : NSObject  
    4. -(void)print  
    5. @end  
    6. @implementation  
    7. -(void)print  
    8. {  
    9.     NSLog(@"this is Class A");  
    10. }  
    11. @end  
    12.   
    13. //定义类 B  
    14. @interface B : NSObject  
    15. -(void)print  
    16. @end  
    17. @implementation  
    18. -(void)print  
    19. {  
    20.     NSLog(@"this is Class B");  
    21. }  
    22. @end  
    23.   
    24. int main(int argc, char *argv[])  
    25. {  
    26.     NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];  
    27.     A *a=[[A alloc] init];//实例化类A对象  
    28.     B *b=[[B alloc] init];//实例化类B对象  
    29.     [a print];          //调用类A的print方法  
    30.     [b print];          //调用类B的print方法  
    31.       
    32.     [a release];        //释放实例a  
    33.     [b release];        //释放实例b  
    34.     [pool drain];  
    35.       
    36.     return 0;  
    37. }  


    程序的最终输出结果如下:

    this is Class A

    this is Class B

    那么类A和类B都包含了print方法,那么系统怎么知道什么时候调用哪个方法呢?因为Obj-C运行环境时支持类型检查,知道类A是print消息的第一个接收者,类B是第二个接收者,那么也就是同一个方法名有不同的类实现,我们称之为多态性。

    2. 动态绑定和动态类型

    id是公用的对象类型,它可以用来存放任何类的对象,那么我们就再来看一个如何运用id实现动态绑定的例子:

     
    1. int main(int argc, char *argv[])  
    2. {  
    3.     NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];  
    4.     id temObj;            //声明一个id<strong>类型</strong>  
    5.     A *a=[[A alloc] init];//实例化类A对象  
    6.     B *b=[[B alloc] init];//实例化类B对象  
    7.       
    8.     temObj=a;             //将a对象赋值给temObj  
    9.     [temObj print];       //调用类A的print方法  
    10.       
    11.     temObj=b;             //将b对象赋值给temObj  
    12.     [temObj print];       //调用类B的print方法  
    13.       
    14.     [a release];        //释放对象a  
    15.     [b release];        //释放对象b  
    16.     [pool drain];  
    17.       
    18.     return 0;  
    19. }  

    在上面的代码中我们可以看到temObj被声明为id类型,因此它可以存放任何类型的对象,当temObj存放类A的对象a时,我们就可以通过temObj调用类A的全部方法,同样,当temObj存放的类B的对象b时,我们也可以通过temObj来访问类B的全部方法。

    那么,程序是如何知道我们要调用哪一个类的print方法呢?很简单,因为Obj-C在运行时,环境会一直对“对象属于哪个类”进行追踪,基于动态类型动态绑定的概念,系统会对对象的类作出正确的决定,系统会在运行的时候而不是编译的时候决定调用哪一个方法。

    下面是Object类确认对象类型的基础API:

    确认类型API表
    方法功能
    -(BOOL)isKindOfClass:class-object 判断对象是否是某一种类(包括其父类)的实例
    -(BOOL)isMemberOfClass:class-object 判断对象是否是某一种类(不包括其父类)的实例
    -(BOOL)respondsToSelector:selector 判断对象是否有实现某个方法
    +(BOOL)instancesRepondToSelector:selector 判断类的实例是否有实现某个方法
    +(BOOL)isSubclassOfClass:class-object 判断一个类是否是某个类的子类
    -(id)performSelector:selector 让对象调用指定的方法
    -(id)performSelector:selector withObject: object 让对象调用指定的方法并且带一个参数
    -(id)performSelector:selector withObject: object1 withObject: object2 让对象调用指定的方法并且带两个参数


    上面的表格中提到了常用的api方法,那么在程序中我们可以灵活使用这些api来方便地实现各种动态编程语言特性,使得Obj-C拥有了很多动态脚本语言才有地特性

  • 相关阅读:
    使用性能监视器找出SQLServer硬件瓶颈
    重启sql server 服务
    优化SQL Server数据库查询方法
    tempdb对SQL Server数据库性能有何影响
    利用动态管理视图提高SQL Server索引效率
    SQL Server 2008 R2数据库镜像部署
    优化数据库的注意事项
    查看 SQL Server 2000 中数据表所占用的磁盘空间
    SQL Server 2005 排查I/O瓶颈
    SQL语句优化的原则
  • 原文地址:https://www.cnblogs.com/mcj-coding/p/3569871.html
Copyright © 2020-2023  润新知