概述
Objective-C运行时是一个运行时库,为Objective-C语言的动态属性提供支持,因此与所有Objective-C应用程序相连。Objective-C运行时库支持函数在共享库中实现/usr/lib/libobjc.A.dylib
。
在Objective-C中编程时,通常不需要直接使用Objective-C运行时库。此API主要用于在Objective-C和其他语言之间开发桥接层,或者用于低级调试。
Objective-C运行时库的macOS实现是Mac独有的。对于其他平台,GNU编译器集合提供了具有类似API的不同实现。本文档仅介绍了macOS实现。
低级Objective-C运行时API在OS X版本10.5中进行了大量更新。许多函数和所有现有的数据结构都被新的函数所取代。旧的函数和结构在32位模式中不推荐使用,在64位模式下不存在。即使在64位模式类计数,协议计数,每个类的方法,每个类的ivars,每个方法的参数,每个方法的sizeof(所有参数)和类版本号中,API也将几个值限制为32位整数。此外,新的Objective-C ABI(此处未描述)进一步限制sizeof(anInstance)
为32位,并且另外三个值为24位 - 每个类的方法,每个类的ivars,以及sizeof(单个ivar)。最后,已过时NXHashTable
,NXMapTable
限于40亿件。
字符串编码
char *
运行时API中的所有内容都应该被认为具有UTF-8编码。
下面的“已弃用”表示“对于32位代码,在OS X版本10.5中已弃用,对于64位代码不允许。
符号
使用类
func class_getName(AnyClass!)
返回类的名称。
func class_isMetaClass(AnyClass!)
返回一个布尔值,指示类对象是否是元类。
func class_getInstanceSize(AnyClass!)
返回类的实例的大小。
func class_getInstanceVariable(AnyClass!, UnsafePointer<Int8>!)
返回Ivar
给定类的指定实例变量。
func class_getClassVariable(AnyClass!, UnsafePointer<Int8>!)
返回Ivar
给定类的指定类变量。
func class_getIvarLayout(AnyClass!)
返回Ivar
给定类的布局的描述。
func class_getWeakIvarLayout(AnyClass!)
返回Ivar
给定类的弱s 的布局的描述。
func class_setWeakIvarLayout(AnyClass!, UnsafePointer<UInt8>!)
Ivar
为给定类设置弱s 的布局。
func class_getProperty(AnyClass!, UnsafePointer<Int8>!)
返回具有给定类的给定名称的属性。
func class_addMethod(AnyClass!, Selector!, IMP!, UnsafePointer<Int8>!)
向具有给定名称和实现的类添加一个新方法。
func class_getInstanceMethod(AnyClass!, Selector!)
返回给定类的指定实例方法。
func class_getClassMethod(AnyClass!, Selector!)
返回指向描述给定类的给定类方法的数据结构的指针。
func class_getMethodImplementation(AnyClass!, Selector!)
返回如果将特定消息发送到类的实例时将调用的函数指针。
func class_getMethodImplementation_stret(AnyClass!, Selector!)
返回如果将特定消息发送到类的实例时将调用的函数指针。
func class_respondsToSelector(AnyClass!, Selector!)
返回一个布尔值,指示类的实例是否响应特定的选择器。
func class_conformsToProtocol(AnyClass!, Protocol!)
返回一个布尔值,指示类是否符合给定的协议。
func class_getVersion(AnyClass!)
返回类定义的版本号。
func class_setVersion(AnyClass!, Int32)
设置类定义的版本号。
添加类
func objc_disposeClassPair(AnyClass!)
销毁一个类及其相关的元类。
func objc_registerClassPair(AnyClass!)
注册使用分配的类objc_allocateClassPair(_:_:_:)
。
使用实例
func object_getIvar(Any!, Ivar!)
读取对象中的实例变量的值。
func object_setIvar(Any!, Ivar!, Any!)
设置对象中的实例变量的值。
func object_getClassName(Any!)
func object_getClass(Any!)
返回对象的类。
获取类定义
func objc_copyClassList(UnsafeMutablePointer<UInt32>!)
创建并返回一个指向所有注册类定义的指针列表。
func objc_lookUpClass(UnsafePointer<Int8>!)
返回指定类的类定义。
func objc_getClass(UnsafePointer<Int8>!)
返回指定类的类定义。
func objc_getMetaClass(UnsafePointer<Int8>!)
返回指定类的元类定义。
使用实例变量
func ivar_getName(Ivar!)
返回实例变量的名称。
func ivar_getTypeEncoding(Ivar!)
返回实例变量的类型字符串。
func ivar_getOffset(Ivar!)
返回实例变量的偏移量。
关联参考
func objc_setAssociatedObject(Any!, UnsafeRawPointer!, Any!, objc_AssociationPolicy)
使用给定的键和关联策略为给定对象设置关联值。
func objc_getAssociatedObject(Any!, UnsafeRawPointer!)
返回与给定键的给定对象相关联的值。
func objc_removeAssociatedObjects(Any!)
删除给定对象的所有关联。
使用方法
func method_getName(Method!)
返回方法的名称。
func method_getTypeEncoding(Method!)
返回描述方法的参数和返回类型的字符串。
func method_copyReturnType(Method!)
返回描述方法的返回类型的字符串。
func method_copyArgumentType(Method!, UInt32)
返回描述方法的单个参数类型的字符串。
func method_getReturnType(Method!, UnsafeMutablePointer<Int8>!, Int)
通过引用返回一个描述方法的返回类型的字符串。
func method_getNumberOfArguments(Method!)
返回方法接受的参数数。
func method_getArgumentType(Method!, UInt32, UnsafeMutablePointer<Int8>!, Int)
通过引用返回描述方法的单个参数类型的字符串。
func method_getDescription(Method!)
返回指定方法的方法描述结构。
使用库
func objc_copyImageNames(UnsafeMutablePointer<UInt32>!)
返回所有加载的Objective-C框架和动态库的名称。
func class_getImageName(AnyClass!)
返回类源自的动态库的名称。
使用选择器
使用协议
func objc_copyProtocolList(UnsafeMutablePointer<UInt32>!)
返回运行时已知的所有协议的数组。
func objc_registerProtocol(Protocol!)
使用Objective-C运行时注册新创建的协议。
func protocol_addProtocol(Protocol!, Protocol!)
将已注册的协议添加到正在构建的另一个协议。
func protocol_addProperty(Protocol!, UnsafePointer<Int8>!, UnsafePointer<objc_property_attribute_t>!, UInt32, Bool, Bool)
将属性添加到正在构建的协议。
func protocol_getName(Protocol!)
返回协议的名称。
func protocol_isEqual(Protocol!, Protocol!)
返回一个布尔值,指示两个协议是否相等。
func protocol_copyMethodDescriptionList(Protocol!, Bool, Bool, UnsafeMutablePointer<UInt32>!)
返回满足给定协议的给定规范的方法的方法描述的数组。
func protocol_getMethodDescription(Protocol!, Selector!, Bool, Bool)
返回给定协议的指定方法的方法描述结构。
func protocol_conformsToProtocol(Protocol!, Protocol!)
返回一个布尔值,指示一个协议是否符合另一个协议。
使用属性
使用Objective-C语言特性
func objc_enumerationMutation(Any!)
当在foreach迭代期间检测到突变时,由编译器插入。
func imp_implementationWithBlock(Any!)
当调用方法时,创建一个指向调用指定块的函数的指针。
func imp_getBlock(IMP!)
返回与IMP
使用创建的块相关联的块imp_implementationWithBlock(_:)
。
func imp_removeBlock(IMP!)
从IMP
使用创建的块中分离块imp_implementationWithBlock(_:)
,并释放创建的块的副本。
func objc_loadWeak(AutoreleasingUnsafeMutablePointer<AnyObject?>!)
加载由弱指针引用的对象并返回它。
类定义数据结构
Method
表示类定义中的方法的不透明类型。
Ivar
表示实例变量的不透明类型。
Category
表示类别的不透明类型。
objc_property_t
一个不透明的类型,表示一个Objective-C声明的属性。
objc_method_description
定义一个Objective-C方法。
objc_property_attribute_t
实例数据类型
这些是表示对象,类和超类的数据类型。
-
objc_object
指向类的实例的指针。 -
objc_object
表示类的实例。 -
objc_super
指定实例的超类。
objc_object
objc_super
指定实例的超类。
常量
此宏指示是否必须将分派函数强制转换为适当的函数指针类型。
Associative Object Behaviors
与关联引用相关的策略。