7 | Objective-C动态特性
2016-04-12 09:05
471 查看
Objective-C的动态特性:动态类型(dynamic typing)、动态绑定(dynamic binding)、动态方法决议、动态加载(dynamic loading)、自省(introspection)
动态类型
即运行时再决定对象的类型。简单说就是id类型,id类型即通用的对象类,任何对象都可以被id指针所指,而在实际应用中,往往使用introspection(自省)来确定该对象的实际所属类型。
eg1:
- (NSIteger)computeValue:(id)parameter;
这个方法参数为id类型,说明它可以处理任何类实例。
eg2:
id obj = someInstance;
if ([obj isKindOfClass:someClass]) {
//todo
}
自省说明:使用一些自省方法以动态的方式在程序运行时查询与方法相关的信息、测试对象的继承性,行为和一致性信息。
自省方法列举:
isKindOfClass: 判断接收器是目标类或者其子类的实例
someInstance isMemberOfClass:someClass 判断someInstance是否是某个类的成员,和isKindOfClass类似
someInstance respondsToSelector:@selector(someFunction) 判断someInstance是否实现或者继承了能够对指定消息作出回应的方法。
someInstance conformsToProtocol:@protocol(someProtocol) 判断someInstance是否遵循某协议
someInstance methodSignatureForSelector:@selector(someFunction) 为选择器提取方法签名
动态绑定
基于dynamic typing,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也就被完全确定了,这就是动态绑定。也就是说动态绑定所做的就是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。
动态方法决议说明:
使用动态方法决议可以实现方法的动态实现。使用Objective-C中的@dynamic指令,可以告知编译器与属性关联的方法会以动态的方式实现。在cocoa层,我们一般向一个NSObject对象发送-respondsToSelector:或者-instanceRespondsToSelector:等来确定对象是否可以响应某个SEL,而在OC消息转发机制被触发之前,对应的类的+resolveClassMethod:和+resolveInstanceMethod:将会被调用,在此时有机会动态地向类或者实例添加新的方法,也即类的实现是可以动态绑定的。
-------------------------------
深入运行时特性
基本的动态特性在常规的cocoa开发中非常常用,特别是dynamic typing和dynamic binding。由于cocoa程序大量使用了protocol-delegate的设计模式,因此绝大部分的delegate指针必须是id,以满足运行时delegate的动态替换。在Objective-C中还有一些高级或者说更底层的运行时特性,在一般的cocoa开发中较为少见,基本被运用在编写OC和其他语言的接口上。这类运行特性大多由/usr/lib/libobjc.A.dylib这个动态库提供,里面包括了对于类、实例成员、成员方法和消息发送的很多API,包括获取类实例变量列表,替换类的方法,为类成员添加变量,动态改变方法实现等,十分强大。
关于isa、SEL、IMP的简单解释
动态类型
即运行时再决定对象的类型。简单说就是id类型,id类型即通用的对象类,任何对象都可以被id指针所指,而在实际应用中,往往使用introspection(自省)来确定该对象的实际所属类型。
eg1:
- (NSIteger)computeValue:(id)parameter;
这个方法参数为id类型,说明它可以处理任何类实例。
eg2:
id obj = someInstance;
if ([obj isKindOfClass:someClass]) {
//todo
}
自省说明:使用一些自省方法以动态的方式在程序运行时查询与方法相关的信息、测试对象的继承性,行为和一致性信息。
自省方法列举:
isKindOfClass: 判断接收器是目标类或者其子类的实例
someInstance isMemberOfClass:someClass 判断someInstance是否是某个类的成员,和isKindOfClass类似
someInstance respondsToSelector:@selector(someFunction) 判断someInstance是否实现或者继承了能够对指定消息作出回应的方法。
someInstance conformsToProtocol:@protocol(someProtocol) 判断someInstance是否遵循某协议
someInstance methodSignatureForSelector:@selector(someFunction) 为选择器提取方法签名
动态绑定
基于dynamic typing,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也就被完全确定了,这就是动态绑定。也就是说动态绑定所做的就是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。
动态方法决议说明:
使用动态方法决议可以实现方法的动态实现。使用Objective-C中的@dynamic指令,可以告知编译器与属性关联的方法会以动态的方式实现。在cocoa层,我们一般向一个NSObject对象发送-respondsToSelector:或者-instanceRespondsToSelector:等来确定对象是否可以响应某个SEL,而在OC消息转发机制被触发之前,对应的类的+resolveClassMethod:和+resolveInstanceMethod:将会被调用,在此时有机会动态地向类或者实例添加新的方法,也即类的实现是可以动态绑定的。
-------------------------------
深入运行时特性
基本的动态特性在常规的cocoa开发中非常常用,特别是dynamic typing和dynamic binding。由于cocoa程序大量使用了protocol-delegate的设计模式,因此绝大部分的delegate指针必须是id,以满足运行时delegate的动态替换。在Objective-C中还有一些高级或者说更底层的运行时特性,在一般的cocoa开发中较为少见,基本被运用在编写OC和其他语言的接口上。这类运行特性大多由/usr/lib/libobjc.A.dylib这个动态库提供,里面包括了对于类、实例成员、成员方法和消息发送的很多API,包括获取类实例变量列表,替换类的方法,为类成员添加变量,动态改变方法实现等,十分强大。
关于isa、SEL、IMP的简单解释
相关文章推荐
- json字符串转换为JSONObject和JSONArray
- Java - Object类
- UE4中StaticLoadClass和StaticLoadObject
- OC阅读笔记十八:僵尸对象(Zombie Object)
- ios objective-c block
- NSDictionary、NSMutableDictionary的基本用法
- 常用正则表达式大全
- net.sf.JSONObject学习
- Objective-C 和 Core Foundation 对象相互转换的内存管理总结
- Microsoft Component Object Model (COM)介绍
- windows多线程系列006_WaitForMultipleObjects详解
- 根据对象的某个字段对List<Object>排序
- ios runtime 动态属性objc_setAssociatedObject和objc_getAssociatedObject
- Preference Learning——Object Ranking
- Jackson 高性能的JSON处理 ObjectMapper
- Objective-C 之Runtime消息机制
- Objective-C 与 C++ 的区别
- iOS开发之Objective-c的MD5/SHA1加密算法的实现
- Objective-C利用AFN上传头像、UIAlertController的使用
- Objective-C的对象模型和runtime机制