您的位置:首页 > 移动开发 > Objective-C

运行时机制 - 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特性:

@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。


了解得越深,就看得越清楚!!!


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: