Objective-C是一门动态性比较强的编程语言,跟C、C++等语言有着很大的不同

Objective-C的动态性是由Runtime API来支撑的

Runtime API提供的接口基本都是C语言的,源码由C\C++\汇编语言编写

libobjc源码

下载地址

代码地址

GNUstep是GNU计划的项目之一,它将Cocoa的OC库重新开源实现了一遍。虽然GNUstep不是苹果官方源码,但还是具有一定的参考价值。

关联对象

默认情况下,因为分类底层结构的限制,不能添加成员变量到分类中。但可以通过关联对象来间接实现。

方法定义

添加关联对象(Set)

void objc_setAssociatedObject(id object, const void * key, id value, objc_AssociationPolicy policy)

获得关联对象(Get)

id objc_getAssociatedObject(id object, const void * key)

移除所有的关联对象(Remove)

void objc_removeAssociatedObjects(id object)

objc_AssociationPolicy

objc_AssociationPolicy 对应的修饰符
OBJC_ASSOCIATION_ASSIGN assign
OBJC_ASSOCIATION_RETAIN_NONATOMIC strong, nonatomic
OBJC_ASSOCIATION_COPY_NONATOMIC copy, nonatomic
OBJC_ASSOCIATION_RETAIN strong, atomic
OBJC_ASSOCIATION_COPY copy, atomic

key的常见用法

// 使用全局变量
static const char MyKey;
objc_setAssociatedObject(obj, &MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_getAssociatedObject(obj, &MyKey)