IOS的动态性
IOS的动态性主要来自以下方面的特性:动态类型,动态绑定,动态载入,SEL类型。
1、IOS的动态类型:(强类型)id可以在代码运行时判断对象的类型。使用id类型(又称强类型)可以在运行的时候使用任何数据类型来替换。动态类型让程序更加灵活,但会使数据的统一性降低。我们常用的静态类型如NSString等是有着自己的优势的,使用静态类型编译器可以完全分析代码的性能,可预知性更高;
2、IOS动态绑定:可以在代码运行的时候判断需要调用什么方法。动态类型和动态绑定使得选择那个接收者以及调用哪个方法都可以在运行时决定;
3、动态载入:应用可以根据需要加载可执行代码以及资源,而不是在启动时就加载所有资源;
4、SEL类型IOS在编译的时候会根据方法的名字(包括参数序列),生成一个用来区分这个方法的唯一的ID,这个ID是SEL类型的,SEL的本质就是类方法的编号[函数地址]。
在运行时候是通过方法的标示来查找方法的。只要方法的名字(包括参数序列)相同,那么它们的ID都是相同的。可以通过@select()指示符获得方法的标示。
通过方法的名字获取到方法的ID也就是SEL:
SEL 变量名 = @selector(方法名字);
SEL 变量名 = NSSelectorFromString(NSString*);//根据方法名得到方法标识
NSString * 变量名 = NSStringFromSelector(SEL); //得到SEL类型的方法名我们可以通过给一个方法传递SEL参数,让这个方法动态的执行某一个方法;
我们也可以通过配置文件指定需要执行的方法,程序读取配置文件之后把方法的字符串翻译成为SEL变量然后给相应的对象发送这个消息.
PS:动态类型识别主要是依靠NSObject类的几个API接口:
-(BOOL)isKindOfClass:class-object 判断对象是否是某类(包括其父类)的实例
-(BOOL)isMemberOfClass:class-object 判断对象是否是某类(不包括其父类)的实例
-(BOOL)respondsToSelector:selector 判断对象的实例是否有实现某个方法
+(BOOL)instancesRepondToSelector:selector 判断对象是否有实现某个方法
+(BOOL)isSubclassOfClass:class-object 判断一个类是否是某个类的子类
-(id)performSelector:selector 让对象调用指定的方法
-(id)performSelector:selector withObject: object 让对象调用指定的方法并且带一个参数
-(id)performSelector:selector withObject: object1 withObject: object2 让对象调用指定的方法并且带两个参数
IOS的动态性的更多相关文章
- iOS 面试题 1
1. 简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite ...
- 【原】iOS动态性(五)一种可复用且解耦的用户统计实现(运行时Runtime)
声明:本文是本人 编程小翁 原创,转载请注明. 为了达到更好的阅读效果,强烈建议跳转到这里查看文章. iOS动态性是我的关于iOS运行时的系列文章,由浅入深,从理论到实践.本文是第5篇.有兴趣可以看看 ...
- 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- 【原】iOS动态性(四):一行代码实现iOS序列化与反序列化(runtime)
为取得更好的排版效果,本文同样发布在简书上,强烈建议跳转到[1]http://www.jianshu.com/p/fed1dcb1ac9f 一.变量声明 为便于下文讨论,提前创建父类Biology以及 ...
- 【原】iOS动态性(二):运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)
OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是私有方法以及私有属性都是可以动 ...
- 【原】iOS动态性(一):动态添加属性的方法——关联(e.g. 向Category添加属性)
想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative ...
- iOS动态性:动态添加属性的方法——关联(e.g. 向Category添加属性)
想到要如何为所有的对象增加实例变量吗?我们知道,使用Category可以很方便地为现有的类增加方法,但却无法直接增加实例变量.不过从Mac OS X v10.6开始,系统提供了Associative ...
- iOS动态性 运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)
借助前辈的力量综合一下资料. OC是运行时语言,只有在程序运行时,才会去确定对象的类型,并调用类与对象相应的方法.利用runtime机制让我们可以在程序运行时动态修改类.对象中的所有属性.方法,就算是 ...
- iOS开发系列—Objective-C之Foundation框架
概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...
随机推荐
- java 获取指定日前的前一天
/** * @Author: * @Description:更加输入日期,获取输入日期的前一天 * @Date: * @strData:参数格式:yyyy-MM-dd * @return:返回格式:y ...
- 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)
http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...
- logistic回归(一)
http://www.2cto.com/kf/201307/226576.html , 这个是Sigmoid函数,在这个回归过程中非常重要的函数,主要的算法思想和这个密切相关.这个函数的性质大家可以自 ...
- capwap学习笔记——初识capwap(一)
2 初识CAPWAP 2.1 CAPWAP简介 说了半天CAPWAP,连全称都还没说,汗-- CAPWAP--Control And Provisioning of Wireless Access P ...
- ubuntu14.04-64位机配置android开发环境,ADT,sdk,eclipsea
这是一篇没有图的好文章,对于学习android的非常实用 1.首先到orcale官网 http://www.oracle.com/technetwork/java/javase/download ...
- Effective JavaScript Item 63 注意异步调用中可能会被忽略的异常
异常处理是异步编程的一个难点. 在同步的代码中,异常可以非常easy地通过try catch语句来完毕: try { f(); g(); h(); } catch (e) { // handle an ...
- 编程实战——电影管理器之XML存储电影信息数据
但凡管理器之类的软件,存储数据是必不可少的.存储数据的话,有几种选择.一是用数据库,把数据存储到数据库里:一是用文本文件,把数据存储到文本文件里:一种是利用XML文件,把数据对象转换为XML后,存储到 ...
- pycharm+python+Django之web开发环境的搭建(windows)
转载:https://blog.csdn.net/yjx2323999451/article/details/53200243/ pycharm+python+Django之web开发环境的搭建(wi ...
- CentOS6.5安装nginx1.5.8时出现“cp: "conf/koi-win" 与"/usr/local/nginx/conf/koi-win" 为同一文件”的解决方法
安装方法主要参考了:http://www.cnblogs.com/zhoulf/archive/2013/02/09/2909653.html这篇文章,出现“cp: "conf/koi-wi ...
- MSSQL 2005/2008 日志压缩清理方法小结
适用于SQL Server 2005的方法 --------------------------------------------- 复制代码 代码如下: USE DNName GO 1,清理日志 ...