ios - objective-c runtime之随笔
今天身体不舒服,还顶着写这篇博客。
举个例子,我们之前在写objective-c代码时,经常用到id这个关键字。那 id 究竟是什么?在objective-c的运行时,这样描述的,它其实是一个结构体(struct)objc_object。
struct objc_object {
Class isa;
};
Class究竟是什么呢?其实它也是一个结构体,定义为如下:typedef struct objc_class *Class。
再如我们经常用到SEL关键字,那它究竟是什么呢?
typedef struct objc_selector *SEL;
A method selector is a C string that has been registered (or “mapped“) with the Objective-C runtime。意思是说一个方法的选择器是一个C的字符串(在objective-c运行时注册)。
平时,我们经常定义很多方法,调用很多方法。那方法的定义是什么?
typedef struct objc_method *Method;
在objective-c中,有些比较奇葩的关键字很容易跟C的关键字混淆。如 BOOL 关键字。它的定义如下:typedef signed char BOOL;噢,竟然是一个不带符号的字符。那 YES 和 NO 又是什么呢? 一看很无语,
#define YES (BOOL)1
#define NO (BOOL)0
objective - c 里,还有2个奇葩的关键字 nil 和 Nil。估计没几个人能够回答出这2个关键字的区别。先看看他们的定义吧。
#define nil __DARWIN_NULL #define Nil __DARWIN_NULL
从定义上看没有区别,但位置上却有区别。 nil 定义在 MacType.h, 代表是实例是空的。 Nil 定义在 objc/objc.h, 代表是空类。
我们在写objc代码时,免不了要定义很多属性。那属性在objc里面的定义是怎么样的?typedef struct objc_property *objc_property_t;
它也是一个结构体...那我们经常使用的retain,weak等关键字会是什么?会是一个结构体吗?答案:NO!它是一个枚举类型。
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
看到很无语.
那super又是什么呢?
struct objc_super { id receiver; Class class; };
结构体嵌套.... 我还有一个疑问,这么庞大的API,它靠什么样的机制区分开来。
我认真瞄了一下,它应该是有个版本号来管理的。因为它有class_getVersion和class_setVersion.
objc的函数调用实质是消息分发。
在runtime,有2个API可以实现, 一个是 objc_msgSend (给一个类的实例发送信息),一个是objc_msgSendSuper (给它的超类发送一个信息)。
今天先写这么多,后回分解!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现