运行时机制 - Objective C

对于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。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值