• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

/*

 静态类型:

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

 动态类型:

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

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

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

 

 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));


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
FTPClientinVS2003(C#)发布时间:2022-07-14
下一篇:
c#泛型与其他语言的对比(深入理解c#)发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap