Objective-C跟C最大的差别,应该是动态定型(dynamicaly typed),支持在运行时动态类型决议(dynamic typing),动态绑定(dynamic binding)以及动态装载(dynamic loading)。Objective-C 在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类,而C语言编译时静态绑定,甚至很多时候你没定义的方法直接就编译不过。

Message

  Messaging是Object-C动态定型的实现方法。当调用一个类方法时,系统就给这个对象发消息:

  objc_msgSend(receiver, selector, arg1, arg2, ...)
id target = getTheReceiver();
SEL method = getTheMethod();
if ( target == self || method == _cmd )[target performSelector:method];

 receiver指定哪个对象接收消息,selector是调用方法,arg1..后面是参数。

 所以每个类有两个必须的基本元素:

 1.A pointer to the superclass.(指向superclass的指针)

2.A class dispatch table. (一张自己所支持方法的分发表)

当它收到一个消息时message,它取出selector,然后遍历自己的dispatch table,如果在dispatch table,就去执行,否则把message传递给super。

Message Forwarding

既然Object-C是动态绑定,当它运行时,收到一个不支持的消息,那必定会出现异常,不特殊处理这个异常的话,程序就崩溃了。不过幸运的是,系统可以在error出现之前,通过判断对象是不是能调用这个方法:(negotiate代表你需要执行的函数)

- negotiate {
if ( [someOtherObject respondsTo:@selector(negotiate)] )
return [someOtherObject negotiate];
}

不过这种方法就很笨重了,每一个方法就写一个函数,甚至很多时候你都不知道你需要支持什么函数,所以应该用如下方法来处理未支持的消息:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
if ([self respondsToSelector:aSelector]) {
return [super methodSignatureForSelector:aSelector];
}
else {
  //不支持的方法随便返回一个NSMethodSignature,当然不能返回nil,否则还是会崩溃
return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}
} -(void)forwardInvocation:(NSInvocation *)anInvocation
{
if ([self respondsToSelector:
[anInvocation selector]])
[anInvocation invokeWithTarget:self];
else{
//什么做,就不崩溃了
}
}

这两个方法可以从NSobject继承重写,从anInvocation取出selector,如果是支持的就激活invoke,否则就不管了。通过重写这两个函数,即使这个类调用了不支持的方法,也不会导致程序崩溃了。

既然这个方法可以防止系统崩溃,为什么系统不直接实现呢?估计还是效率问题,如果接收每个message都去判断是不是支持,那必定会耗费时间。

Surrogate Objects 

这里就简单说说surrogate。代理,顾名思义,也就是可以把对象接受到的消息转给一个代理object处理。也是通过重写上面说的两个函数:

//surrogateObject1和surrogateObject2就是self的两个对象,用来作为self的代理,把self收到的消息转给surrogateObject1或2处理

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
//对不同的aSelector,是返回self,还是返回surrogateObject1或surrogateObject2的NSMethodSignature就可
} - (void)forwardInvocation:(NSInvocation *)invocation {
//同理,对不同的selector,激活self或者是surrogateObject1或surrogateObject2
}

一般没怎么用。大家可以自己看看。

一般来说,了解编程语言的特征,对编写程序还是很有必要的。仅供参考。

参考资料:ObjCRuntimeGuide.pdf(iOS官方文档)

Dynamicaly Typed(动态定型), Objective-C Runtime Programming的更多相关文章

  1. iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下:   1.相同点   都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...

  2. Objective C Runtime 开发介绍

    简介 Objective c 语言尽可能的把决定从编译推迟到链接到运行时.只要可能,它就会动态的处理事情.这就意味着它不仅仅需要一个编译器,也需要一个运行时系统来执行变异好的代码.运行时系统就好像是O ...

  3. 什么是动态语言 OC 的runtime

    OC是一门 动态语言. 问题来了.什么是动态语言? 与之相对的静态语言? 学习C++的时候,记得一个名词:“运行时的动态绑定”. 这个是 “多态”的概念. 简单提一下:关键:类指针可以指向本类,或者其 ...

  4. 使用runtime给类动态添加方法并调用 - class_addMethod

    上手开发 iOS 一段时间后,我发现并不能只着眼于完成需求,利用闲暇之余多研究其他的开发技巧,才能在有限时间内提升自己水平.当然,“其他开发技巧”这个命题对于任何一个开发领域都感觉不找边际,而对于我来 ...

  5. 刨根问底Objective-C Runtime(4)- 成员变量与属性

    http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective[nil]c-runtime(4)[nil]-cheng-yuan-bian-lian ...

  6. ios开发runtime学习三:动态添加方法(实际应用少,面试)

    #import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...

  7. Objective-C:runtime

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  8. 全方位分析Objcetive-C Runtime

    本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 ...

  9. 全方位分析Objcetive-C Runtime 分类: ios技术 2015-03-11 22:29 77人阅读 评论(0) 收藏

    本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 ...

随机推荐

  1. rdlc报告vs2008编辑正常,在vs2012在对错误的编辑

    最近我们的系统开发的工具vs2008升级到2012,由于系统是非常的报告是由rdlc发展.今天 有需要修改的报告满足需求.直接使用vs2012正确rdlc报告编辑,结果本次变动后.报表都报错. 后来我 ...

  2. Leetcode:unique_binary_search_trees

    一.     称号 给定的数目n.问:有多少种不同BST(二叉搜索树) 比如: 因为N =3,共同拥有5种独特的BST. 1          3      3       2      1 \   ...

  3. Android两个注意事项.深入了解Intent和IntentFilter(两)

    深入理解Intent和IntentFiler(二) 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)     在上一篇文章中,我们比較具体学习了&q ...

  4. HTML5 画一张图

    笔者:本笃庆军 原文地址:http://blog.csdn.net/qingdujun/article/details/33344289 一.绘制图像 使用drawImage()方法绘制图像. 画图环 ...

  5. 第一个JavaWeb程序

    转载 第一个JavaWeb程序 JavaWeb学习总结第二篇—第一个JavaWeb程序 最近我在学院工作室学习并加入到研究生的项目中,在学长学姐的带领下,进入项目实践中,为该项目实现一个框架(用已有框 ...

  6. 【百度地图API】如何制作商圈地图?行政地图?

    原文:[百度地图API]如何制作商圈地图?行政地图? 摘要: 想要显示某一个区域,并且鼠标放上去,该区域就会变色.这时,你就需要巧用多边形覆盖物,和它的鼠标事件了! 快来看看去哪儿网的实例吧:http ...

  7. NDMCDB数据库hang住故障分析 - cursor: pin S wait on X

    问题描写叙述: 上午刚刚到办公室,就有监控人员邮件反馈,昨晚NDMCDB407数据库被重新启动过,让我分析一下数据库重新启动的原因.因为昨晚业务有版本号上线,所以短信警告关闭了,所以没有短信下发到我手 ...

  8. ThinkPHP框架设计与扩展总结

    详见:http://www.ucai.cn/blogdetail/7028?mid=1&f=5 可在线运行查看效果哦 导言:ThinkPHP框架是国内知名度很高应用很广泛的php框架,我们从一 ...

  9. 使用微软 URL Rewrite Module 开启IIS伪静态

    原文 使用微软 URL Rewrite Module 开启IIS伪静态 在IIS5和IIS6时代,我们使用URL REWRITING可实现URL重写,使得WEB程序实现伪静态,但默认情况下只能实现.A ...

  10. MongoDB集群

    高可用的MongoDB集群   1.序言 MongoDB 是一个可扩展的高性能,开源,模式自由,面向文档的数据库. 它使用 C++编写.MongoDB 包含一下特点: l  面向集合的存储:适合存储 ...