Objective-C Runtime 初探(一)

本文深入探讨了Objective-C语言的设计精巧之处,包括其基于C语言的特性、动态特性和强类型编译型语言的特点。详细解释了Class、id、SEL和IMP的定义与作用,并分析了Objective-C Runtime的实现。同时,提供了源码版本信息,帮助开发者更好地理解和应用Objective-C。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Objective-C 是一种通用、面向对象的编程语言。它以 C 语言为基础并添加了 Smaltalk 的消息特性。它是一种具有动态特性,强类型的编译型语言,其中动态特性是指可以在运行时创建类,为类添加成员变量,为类添加方法。我认为 Objective-C语言设计的比较灵巧:只在 C 语言的基础上增加了比较薄的一层,就具有了面向对象特性和一定的动态特性,于是非常好奇它是如何实现这些特性的。

源码版本:objc4-437.3,可以从苹果的网站上下载。

Objective-C Runtime 2.0 与之前的相比进行了重新实现,这里不分析 2.0 的运行时。

Class 的定义

typedef struct objc_class *Class;

struct objc_class {

    Class isa;

#if !__OBJC2__

    Class super_class;

    const char *name;

    long version;

    long info;

    long instance_size;

    struct objc_ivar_list *ivars;

    struct objc_method_list **methodLists;

    struct objc_cache *cache;

    struct objc_protocol_list *protocols;

#endif

OBJC2_UNAVAILABLE;

 

id 的定义

typedef struct objc_object {

    Class isa;

} *id;

 

SEL 的定义

typedef struct objc_selector    *SEL;

在源码中没有直接找到 objc_selector 的定义,从一些书籍上与 Blog 上看到可以将 SEL 理解为一个 char* 指针,经过自己测试是正确的。但是可以猜测到 struct objc_selector 的定义为:

struct objc_selector  {

char name[64 or ...];

...

};

只要遵循如上原型,就可以将 SEL 理解为一个 char*。大家可能考虑 name 会不会是在Heap上呢?基于如下三个理由,我认为不会在Heap上:第一、name 在编译时就确定了,在加载编译链接后文件时直接放到静态存储区就可以了;第二、通过用IDA 反汇编Mach-O 文件,可以以字符串的形式看到所有方法;第三、虽然现在编译器支持很长的方法名,但基本都有一个固定长度(参考C99标准)。

 

IMP 的定义

typedef id           (*IMP)(idSEL, ...);

IMP 是一个函数指针,而且从原型上可以看出跟用 C 语言模仿面向对象特性很像,比如:C++,Python 等,第一参数都是self。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值