zoukankan      html  css  js  c++  java
  • 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));

  • 相关阅读:
    夜生活
    LOST
    TMD
    玩AJAX要先知道这些
    水漫金陵
    家装
    JAVA里面的小名堂
    朋友值多少钱
    猪八戒
    冬枣
  • 原文地址:https://www.cnblogs.com/hyuganatsu/p/dynamic.html
Copyright © 2011-2022 走看看