运行时机制 - Objective C
2016-02-19 16:31
351 查看
对于OC语言,比较突出的一个特点就是其运行时特性,比较经典的一个题目是:
对于语句NSString* testObject = [[NSData alloc]init];testObject 在编译时和运行时分别是什么类型的对象?
testObject在编译时是NSString类型的对象,并且不会报错,而在运行时却是NSData类型的对象,会使得程序闪退
看过一些资料,都把OC对象看做是C类型的结构体,其中第一个成员变量就是指向类型为class的isa指针,在运行的时候,isa指针会指向NSData类,只能收到NSData的固有实例方法,所谓运行时机制,我个人理解,就是只有在运行时,才决定运行什么代码,比如,在C++中的指向子类的基类指针,相当于给我们提供了一个USB接口一些,只要遵守相关串口协议,就能互相连通,但是具体内容,就要看你是连着鼠标还是手机啦,很多时候,我觉得它更像函数指针,根据接口,开发人员可以自由地创建自己想实现的代码,只要注册一下,就会在先前已经设定函数应该执行的地方,执行自定义功能
唐巧老师曾经刨根问底过Objective C的runtime特性:
其运行结果居然都是Son,通过Clang编译之后的分析,真是有种豁然开朗的感觉!!!
一直以来听着OC的消息机制,都一直把它仅仅作为C中的接口调用理解,在初学的时候简化了很多问题,但是慢慢地发现,如果仅仅这样理解OC,那就太表面了
由于调用的是[super init],因此编译转换为objc_msgSendSuper函数,但是只有到了NSObject中才能找到Class方法
对于语句NSString* testObject = [[NSData alloc]init];testObject 在编译时和运行时分别是什么类型的对象?
testObject在编译时是NSString类型的对象,并且不会报错,而在运行时却是NSData类型的对象,会使得程序闪退
看过一些资料,都把OC对象看做是C类型的结构体,其中第一个成员变量就是指向类型为class的isa指针,在运行的时候,isa指针会指向NSData类,只能收到NSData的固有实例方法,所谓运行时机制,我个人理解,就是只有在运行时,才决定运行什么代码,比如,在C++中的指向子类的基类指针,相当于给我们提供了一个USB接口一些,只要遵守相关串口协议,就能互相连通,但是具体内容,就要看你是连着鼠标还是手机啦,很多时候,我觉得它更像函数指针,根据接口,开发人员可以自由地创建自己想实现的代码,只要注册一下,就会在先前已经设定函数应该执行的地方,执行自定义功能
唐巧老师曾经刨根问底过Objective C的runtime特性:
@implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self; } @end
其运行结果居然都是Son,通过Clang编译之后的分析,真是有种豁然开朗的感觉!!!
一直以来听着OC的消息机制,都一直把它仅仅作为C中的接口调用理解,在初学的时候简化了很多问题,但是慢慢地发现,如果仅仅这样理解OC,那就太表面了
NSLog((NSString *)&__NSConstantStringImpl__var_folders_gm_0jk35cwn1d3326x0061qym280000gn_T_main_a5cecc_mi_1, NSStringFromClass( ((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper) ((__rw_objc_super){ (id)self, (id)class_getSuperclass(objc_getClass("Son")) }, sel_registerName("class")) )end of NSStringFromClass );end of NSLog
由于调用的是[super init],因此编译转换为objc_msgSendSuper函数,但是只有到了NSObject中才能找到Class方法
- (Class)class { return object_getClass(self); }
最后return的是self。
了解得越深,就看得越清楚!!!
相关文章推荐
- Qt用QAxObject读取excel编译出错问题解决
- 通过方法名(字符串)执行Objective-C方法
- Objective-C中的NSString,rangeOfString,hasPrefix,hasSuffix
- ObjectiveC浮点数转化整数向上取整、向下取整
- 对象工具类 - ObjectUtils.java
- Objective-C代码规范
- ObjectAnimator 简单使用
- JSONObject与JSONArray的使用
- IoGetDeviceObjectPointer和ObReferenceObjectByName得到设备对象指针
- Odoo8查询产品时提示"maximum recursion depth exceeded while calling a Python object"
- firefox下jquery ajax 返回 [object XMLDocument]处理
- 仿函数(functors/function objects)原理及使用
- 刨根问底Objective-C Runtime
- Objective-C总Runtime的那点事儿(一)消息机制
- Struts的ObjectFactory
- Objective-C 中Self 和 Super 详解
- 用EL表达式取List<Map<String, Object>>map的值(查阅了很久,总结一下)
- Objective-C内存管理
- React Native开发坑之null is not an object (evaluating 'inst.componentWillReceiveProps')
- 继承自NSObject的不常用又很有用的函数(2)