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: 是问某个对象是否是某个类的对象或某个类的子类的对象
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系列-动态类型和动态绑定的更多相关文章
- Objective-C路成魔【11-多态性、动态类型和动态绑定】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 多态这个其 ...
- Python中高层次的数据结构,动态类型和动态绑定,使得它非常适合于快速应用开发,也适合于作为胶水语言连接已有的软件部件。
https://github.com/jhao104/proxy_pool/blob/master/doc/introduce.md 3.代码模块 Python中高层次的数据结构,动态类型和动态绑定, ...
- 为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?
转载:https://www.cnblogs.com/dxb123456/p/5525343.html 动态: 主要是将数据类型的确定由编译时,推迟到了运行时. 这个问题其实浅涉及到两个概念,运行时和 ...
- iOS开发笔记系列-基础3(多态、动态类型和动态绑定)
多态:相同的名称,不同的类 使不同的类共享相同方法名称的能力成为多态.它让你可以开发一组类,这组类中的每一个类都能响应相同的方法名.每个类的定义都封装了响应特定方法所需要的代码,这使得它独立于其他的类 ...
- C++中的动态类型与动态绑定、虚函数、运行时多态的实现
动态类型与静态类型 静态类型 是指不需要考虑表达式的执行期语义,仅分析程序文本而决定的表达式类型.静态类型仅依赖于包含表达式的程序文本的形式,而在程序运行时不会改变.通俗的讲,就是上下文无关,在编译时 ...
- OC基础6:多态、动态类型和动态绑定
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于SEL类型的数据: (1).SEL ...
- OC 动态类型,动态绑定,动态加载
OC 动态类型,动态绑定,动态加载 Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有 动态类型(Dynamic typing) 动态绑定(Dynamic binding) ...
- iOS-------- Objective-C多态:动态类型识别+动态绑定+动态加载
一.Objective-C多态 1.概念:相同接口,不同的实现 来自不同类可以定义共享相同名称的方法. 动态类型能使程序直到执行时才确定对象所属类型 动态类型绑定能使程序直到执行时才确定要对对象调用的 ...
- Objective-C多态:动态类型识别+动态绑定+动态加载
http://blog.csdn.net/tskyfree/article/details/7984887 一.Objective-C多态 1.概念:相同接口,不同的实现 来自不同类可以定义共享相同名 ...
随机推荐
- C# Socket系列三 socket通信的封包和拆包
通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! class Program { static void Main(stri ...
- [转]俞敏洪:我和马云就差了8个字... [来自: news.mbalib.com]
我和马云差了 8 个字:越败越战,愈挫愈勇. 马云,我真的非常的佩服他,首先佩服他的是他跟我有同样的经历,我考了 3 年才考上了大学:他也是考了 3 年.我比他还要幸运一点,我考上的是北大的本科,马云 ...
- Web API应用架构设计分析(1)
Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端(包括浏览器,手机和平板电脑等移动设备)的框架, ASP.NET Web API 是一种用于在 .NET Framewor ...
- 关于Response.Redirect和Server.Execute的区别
Server.Transfer("path")内部重定向请求,是服务器内部的接管,浏览器无法意识到这个接管的发生,浏览器地址栏也不会发生变化.而Response.Redirect( ...
- 检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
Resvr32 .net中引用控件的名称 如果注册成功,问题不在出现 但是如果是在x64位的系统中,即使控件注册成功,错误依照提示,是因为大多数第三方写的COM控件,只支持32位的系统, 在VS中找到 ...
- mysql分页查询详解
我们做的后端项目一般都会有admin管理端,当管理端将要展示数据的时候,就需要用到分页.所以分页的考查在面试中也相当多.在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用o ...
- 《Java4Android》视频学习笔记——为什么用抽象类?
我们来举个例子,然后引出这个问题的答案: 市面上有 喷墨式打印机 和 针式打印机 这两种形式的打印机,我们需要编程来实现他们的 开机,关机以及打印. 构建父类Printer class Printer ...
- js中对象使用
简单记录javascript中对象的使用 一.创建对象 //创建一个空对象 var o={}; //创建一个含有两个属性的对象,x.y var o2={x:12,y:'12',name:'JS'}; ...
- Discuz X2任务开发
简单描述 由于公司的需求要在系统中添加任务管理,用户通过完成任务而获得一定的奖励,因此其设计过程需要考虑到: 1.由于任务都是在系统中相关功能块处做一些相关事情,比如说在做题系统中完成指定的试题[1] ...
- javascript模板库jsrender加载并缓存外部模板文件
前一篇说了jsrender嵌套循环的使用,在SPA的应用中,广泛使用的一个点就是view模板,使用了SPA之后,每个业务页面不再是独立的html,仅仅是一个segment,所以通常这些segment会 ...