7 | Objective-C动态特性
来源:互联网 发布:长高知乎 编辑:程序博客网 时间:2024/06/05 18:05
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的简单解释
- 7 | Objective-C动态特性
- Objective-C语言:动态特性
- Objective-C的动态特性
- Objective-C的动态特性
- Objective-c的动态特性
- Objective-C的动态特性
- Objective-C的动态特性
- Objective-C的动态特性
- Objective-C的动态特性
- Objective-C的动态特性
- Objective-C的动态特性
- 了解Objective-C的动态特性
- 深入Objective-C的动态特性
- (译)Objective-C的动态特性
- (译)Objective-C的动态特性
- (译)Objective-C的动态特性
- (译)Objective-C的动态特性
- (译)Objective-C的动态特性
- svn删除文件引起的“...”missing from working copy
- ANDROID : java.lang.NoSuchMethodError: 在 org.apache.commons.codec.binary.Base64
- 定位“kubernetes pod卡在ContainerCreating状态”问题的方法
- 腾讯实习基础研究面试(包含一个编程题)
- 独具慧眼:从物流的角度为企业“降本增效”
- 7 | Objective-C动态特性
- java有没有 有序的map,而且可以 修改key
- Android、iPhone和Java三个平台一致的加密方法
- 在linux命令行下载百度网盘中的文件
- 锻炼自己(知识方面)
- 关于表单提交并且实现前端跳转
- 计篇(一)
- 【笔试/面试】—— linux 拾遗(一)
- 哪些网站需要HTTPS(SSL证书)