/*

静态类型:

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

动态类型:

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

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

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

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: 是问某个对象是否是某个类的对象或某个类的子类的对象

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

{

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

}

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

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

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

}

if( YES==[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));

objective-c系列-动态类型和动态绑定的更多相关文章

  1. Objective-C路成魔【11-多态性、动态类型和动态绑定】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 多态这个其 ...

  2. Python中高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件。

    https://github.com/jhao104/proxy_pool/blob/master/doc/introduce.md 3.代码模块 Python中高层次的数据结构,动态类型和动态绑定, ...

  3. 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?

    转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...

  4. iOS开发笔记系列-基础3(多态、动态类型和动态绑定)

    多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...

  5. C++中的动态类型与动态绑定、虚函数、运行时多态的实现

    动态类型与静态类型 静态类型 是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型.静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变.通俗的讲,就是上下文无关,在编译时 ...

  6. OC基础6:多态、动态类型和动态绑定

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于SEL类型的数据: (1).SEL ...

  7. OC 动态类型,动态绑定,动态加载

    OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...

  8. iOS-------- Objective-C多态:动态类型识别+动态绑定+动态加载

    一.Objective-C多态 1.概念:相同接口,不同的实现 来自不同类可以定义共享相同名称的方法. 动态类型能使程序直到执行时才确定对象所属类型 动态类型绑定能使程序直到执行时才确定要对对象调用的 ...

  9. Objective-C多态:动态类型识别+动态绑定+动态加载

    http://blog.csdn.net/tskyfree/article/details/7984887 一.Objective-C多态 1.概念:相同接口,不同的实现 来自不同类可以定义共享相同名 ...

随机推荐

  1. nodejs学习篇 (1)webstorm创建nodejs + express + jade 的web 项目

    之前简单了解过nodejs,觉得用nodejs来做个网站也太麻烦了,要自己拼html的字符串返回,这能做网站嘛? 最近看到使用jade模板来开发,觉得挺新奇的,于是试了一把,也了解了一些特性,算是个新 ...

  2. Fiddler使用AutoResponder进行本地文件和线上文件的映射

    直入正题.. 刚刚想写篇总结,照常登上博客园添加新随笔,写了百来字发现有什么不对劲 编辑器去哪儿了... 心想重新登录应该就OK了吧,点击退出然后重新登录 按钮一直显示加载中...简直就没法登录嘛.. ...

  3. 【转】nginx+iis实现负载均衡

    最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其 ...

  4. ASP.NET MVC 网站开发总结(二)——一个或多个文件的异步或同步上传

    简而言之,直接用代码展示如何实现文件的上传,这里需要使用到一个bootstrap的文件上传插件File Input(请自行下载). 前台页面: <!----> <!DOCTYPE h ...

  5. [javaSE] 注解-JDK中的注解

    java中的常见注解 jdk自带注解:@Override 覆盖  @Deprecated 过期  @Suppvisewarnings 压制警告 package com.tsh.ano; public ...

  6. php中数组遍历改值

    <?php $arr = array(100, 99, 88, 77, 55, 66); //方法1 foreach ($arr as &$v) { $v = 2; } print_r( ...

  7. python学习笔记12 ----线程、进程

    进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的 ...

  8. ahjesus可供C#使用的ip地理位置查询插件

    http://dev.maxmind.com/geoip/geoip2/downloadable/#MaxMind_APIs 详情请阅读此链接及相关内容

  9. Node-webkit 资料笔记

    静不下心写学习笔记了,因为发现了这篇文章:<用node-webkit开发多平台的桌面客户端> 另外官网上针对“package.json”的配置参数也已经很详尽了,连我英文不好的也差不多能看 ...

  10. asp.net web常用控件FileUpload(文件上传控件)

    FileUpload控件的主要中能:向指定目录上传文件,该控件包括一个文本框和一个浏览按钮. 常用的属性:FileBytes,FileContent.FileName.HasFile.PostedFi ...