当前位置: 代码迷 >> Iphone >> objective-c系列-动态门类和动态绑定
  详细解决方案

objective-c系列-动态门类和动态绑定

热度:308   发布时间:2016-04-25 05:29:09.0
objective-c系列-动态类型和动态绑定

/*

 静态类型:

    变量的类型在编译之时就被确定下来.

 动态类型:

    对象的类型由对象的内存里的某个结构数据来决定它是什么类型,

    而不是在编译之时就被确定下来的数据类型。

    对象的类型只有在运行时才知道。

 

 oc中的所有对象都有一个共同的基类(根类):NSObject

 oc的动态类型特性完全由NSObject这个类来提供。

 

 分析: NSObject类的一个成员变量: Class isa;  实际上是一个结构体指针类型

 typedef struct objc_class * Class;

 

 结构体如下:

 struct objc_class {

    Class isa;   ?

    Class super_class;  指向父类的结构体

    const char *name;  类名

    long version;   版本

    long info;      信息

    long instance_size;   对象的内存大小

    struct objc_ivar_list *ivars;   类的成员变量的列表

    struct objc_method_list **methodLists;  类的方法列表

    struct objc_cache *cache;     //缓冲区

    struct objc_protocol_list *protocols; //该类遵守的所有协议的列表

 } ;

 

 // SEL 数据类型:  就是oc对方法名的一个编码类型,可以理解成一个整数

 //     如何将一个方法名编码?   

 //     :  @selector(方法名)就可以生成一个SEL类型的值

 //     

 

 // Class:  是一个结构体指针类型,

 // 所以isa是一个结构体的地址

 

 //  如果要判断某个对象是否属于某个类,那么直接问这个对象的isa变量,是不是存的某个类的结构体的地址?

     [person class] ?= [Person class]

 

        isKindOfClass:

        isMemberOfClass:

        class 类方法

        class 对象方法

        performSelector:

        performSelector: withObject:

    还要理解: SEL数据类型   是对方法的一个编码,不必深纠这个编码的值

            Class数据类型:  struct objc_class*

    还要掌握几个函数:   

            NSClassFromString:  用处通过类名得到Class

            NSStringFromClass:  用处通过Class值得到类名

 */

Person *person = [[ Person alloc]init];

        

        SEL sel = @selector(sleeping);

        

        if ([Person instancesRespondToSelector:sel]==YES) {

            NSLog(@"Person类的对象具有方法 sleeping");

            [person sleeping];

        }

        else

            NSLog(@"Person类的对象没有方法 sleeping");

        

        if([person class] == [Person class])

        {

            NSLog(@"你是大坏蛋嘛!");

        }

    

        // isKindOfClass: 是问某个对象是否是某个类的对象或某个类的子类的对象

        ifYES==[person isKindOfClass:NSClassFromString(@"Person")])

        {

            NSLog(@"personPerson类的对象");

        }

        

        Student * stu=[[Student alloc]init];

        

        if (YES ==[stu isKindOfClass:NSClassFromString(@"Person")]) {

            NSLog(@"stu这个对象是Person类的对象或Person类的子类的对象");

        }

        

    

 

        ifYES==[person isMemberOfClass:NSClassFromString(@"Person")])

        {

            NSLog(@"person这个对象是Person类的对象");

        }

        

        if (YES==[stu isMemberOfClass:NSClassFromString(@"Person")]) {

            NSLog(@"stu这个对象是Person类的对象");

        }

        else

        {

            NSLog(@"stu这个对象不是Person类的对象");

        }

 

        //   isMemberOfClass方法的内部就是如下:

        //     if( [self class]==[Person class] )

        //          return YES;

        //     return NO;

        //

    

        [person performSelector:@selector(sleeping) withObject:nil];

        [person performSelector:@selector(printObject:) withObject:@"Message"];

        

        Class cls = NSClassFromString(@"Person");

    NSString *classStr = NSStringFromClass([类名 Class]);// 由类名得到字符串

        NSLog(@"通过Class得到的类名为:%@",NSStringFromClass(cls));