iOS面试—3runtime运行时

Posted saytome

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS面试—3runtime运行时相关的知识,希望对你有一定的参考价值。

https://www.cnblogs.com/zhangxiaoping/p/5146647.html

 

Objective-C的运行时参考

配套指南

Objective-C的运行时编程指南

在宣布

IONDRVLibraries.h 

NSObjCRuntime.h 

objc / message.h 

objc / objc-api.h 

objc / objc.h 

objc / runtime.h

概述

本文档介绍了OS X的Objective-C 2.0运行库支持的函数和数据结构。该功能是在发现共享库实现/usr/lib/libobjc.A.dylib。这个共享库提供支持,为Objective-C语言的动态特性,并因此被所有的Objective-C应用程序链接。

该参考主要是为了开发Objective-C和其他语言之间的桥梁层,或低级别的调试。通常,您不需要在Objective-C编程时直接使用Objective-C的运行时库。

在OS X实现了Objective-C的运行时库是独一无二的苹果。对于其他平台,GNU编译器集提供了不同的执行情况,类似的API。本文只包括Mac OS X的执行情况。

低级别的Objective-C的运行时API是OS X 10.5版本显著更新。许多功能和所有现有的数据结构将被替换为新的功能。旧的功能和结构已过时的32位和缺席的64位模式。该API限制几个值到32位的整数,即使在64位模式下-级计数,计数的协议,每类方法,每个类实例变量,每个方法的参数,每个方法的sizeof(所有参数)和类的版本号。此外,新的Objective-C的ABI(此处不作讨论),进一步约束大小(anInstance)为32位,而其他三个值,以24%的类比特的方法,每个类实例变量和大小(单伊娃)。最后,过时NXHashTableNXMapTable被限制在4十亿的项目。

字符串编码:  所有的char *运行时API中,应考虑到有UTF-8编码。

“弃用”的意思是“过时的OS X 10.5版本的32位代码,并禁止用于64位代码。”

谁应阅读本文件

该文件的目的是为读者谁可能有兴趣学习的Objective-C的运行时。

因为这不是一个关于C文件,它假定了一些以前的熟人与该语言。然而,它并不必须是一个广泛的熟人。

职能任务

使用类

  • class_getName
  • class_getSuperclass
  • class_isMetaClass
  • class_getInstanceSize
  • class_getInstanceVariable
  • class_getClassVariable
  • class_addIvar
  • class_copyIvarList
  • class_getIvarLayout
  • class_setIvarLayout
  • class_getWeakIvarLayout
  • class_setWeakIvarLayout
  • class_getProperty
  • class_copyPropertyList
  • class_addMethod
  • class_getInstanceMethod
  • class_getClassMethod
  • class_copyMethodList
  • class_replaceMethod
  • class_getMethodImplementation
  • class_getMethodImplementation_stret
  • class_respondsToSelector
  • class_addProtocol
  • class_addProperty
  • class_replaceProperty
  • class_conformsToProtocol
  • class_copyProtocolList
  • class_getVersion
  • class_setVersion
  • objc_getFutureClass
  • objc_setFutureClass
  • class_setSuperclass 已过时的OS X V10.5

添加类

  • objc_allocateClassPair
  • objc_disposeClassPair
  • objc_registerClassPair
  • objc_duplicateClass

类的实例化

  • class_createInstance
  • objc_constructInstance
  • objc_destructInstance

用工作实例

  • object_copy
  • object_dispose
  • object_setInstanceVariable
  • object_getInstanceVariable
  • object_getIndexedIvars
  • object_getIvar
  • object_setIvar
  • object_getClassName
  • object_getClass
  • object_setClass

获取类定义

  • objc_getClassList
  • objc_copyClassList
  • objc_lookUpClass
  • objc_getClass
  • objc_getRequiredClass
  • objc_getMetaClass

使用实例变量工作

  • ivar_getName
  • ivar_getTypeEncoding
  • ivar_getOffset

联想参考

  • objc_setAssociatedObject
  • objc_getAssociatedObject
  • objc_removeAssociatedObjects

发送消息

当它遇到一个方法调用时,编译器可能会生成调用任意几个函数来执行实际的消息调度,根据不同的接收器,返回值和参数。您可以使用这些功能来动态地从你自己的纯C代码中调用方法,或者使用不NSObject的公司允许说法的形式进行……方法。这些函数在声明/usr/include/objc/objc-runtime.h

  • objc_msgSend发送一个消息,一个简单的返回值的类的实例。
  • objc_msgSend_stret发送与数据结构返回值的消息,一个类的实例。
  • objc_msgSendSuper发送一个消息,一个简单的返回值的类的实例的超类。
  • objc_msgSendSuper_stret发送消息与数据结构返回值的类的实例的超类。
  • objc_msgSend
  • objc_msgSend_fpret
  • objc_msgSend_stret
  • objc_msgSendSuper
  • objc_msgSendSuper_stret

与工作方法

  • method_invoke
  • method_invoke_stret
  • method_getName
  • method_getImplementation
  • method_getTypeEncoding
  • method_copyReturnType
  • method_copyArgumentType
  • method_getReturnType
  • method_getNumberOfArguments
  • method_getArgumentType
  • method_getDescription
  • method_setImplementation
  • method_exchangeImplementations

使用库

  • objc_copyImageNames
  • class_getImageName
  • objc_copyClassNamesForImage

与选择器的工作

  • sel_getName
  • sel_registerName
  • sel_getUid
  • sel_isEqual

与合作协议

  • objc_getProtocol
  • objc_copyProtocolList
  • objc_allocateProtocol
  • objc_registerProtocol
  • protocol_addMethodDescription
  • protocol_addProtocol
  • protocol_addProperty
  • protocol_getName
  • protocol_isEqual
  • protocol_copyMethodDescriptionList
  • protocol_getMethodDescription
  • protocol_copyPropertyList
  • protocol_getProperty
  • protocol_copyProtocolList
  • protocol_conformsToProtocol

与工作性质

  • property_getName
  • property_getAttributes
  • property_copyAttributeValue
  • property_copyAttributeList

使用Objective-C语言特征

  • objc_enumerationMutation
  • objc_setEnumerationMutationHandler
  • imp_implementationWithBlock
  • imp_getBlock
  • imp_removeBlock
  • objc_loadWeak
  • objc_storeWeak

功能

class_addIvar

增加了一个新的实例变量的类。

布尔class_addIvar(CLS级,为const char *的名字,为size_t大小,uint8_t有调整,为const char *类型)

返回值

是的,如果实例变量添加成功,否则NO(例如,类已经包含了该名称的实例变量)。

讨论

此功能可能仅在被称为objc_allocateClassPair之前objc_registerClassPair。添加一个实例变量到一个已经存在的类不支持。

这个类不能是元类。添加一个实例变量来元类不支持。

以字节为单位的实例变量的最小对齐是1 <<对齐。一个实例变量的最小对齐取决于伊娃的类型和机器架构。对于任何指针类型的变量,通过LOG2(sizeof运算(POINTER_TYPE)) 

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_addMethod

增加了一个新的方法,一类具有给定名称和实施。

布尔class_addMethod(CLS级,SEL名,IMP IMP,为const char *类型)

参数

CLS

类要添加的方法。

一个选择器,用于指定方法的名称被添加。

IMP

的函数,而新方法的实现。该函数必须至少有两个arguments- 自我_cmd

类型

描述的参数的类型的方法,字符数组。对于可能的值,看Objective-C的运行时编程指南 > “输入编码”。因为该函数必须至少有两个arguments- 自我_cmd,第二和第三个字符必须是“ @ “ (第一个字符是返回类型)。

返回值

是的,如果该方法成功地添加,否则NO(例如,类已经包含了一个方法实现了这个名字)。

讨论

class_addMethod将添加一个超类的实现的覆盖,但不会取代此类现有的实现。要更改现有的实现,使用method_setImplementation

一个Objective-C的方法是一个简单的C函数需要至少两个arguments- 自我_cmd。例如,考虑下面的函数:

无效myMethodIMP(ID自我,SEL _cmd)

{

    //实现….

}

您可以动态地将其添加到类中的方法(称为resolveThisMethodDynamically)所示:

class_addMethod([个体经营类],@selector(resolveThisMethodDynamically),(IMP)myMethodIMP,“V @”);

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_addProperty

添加一个属性类。

布尔class_addProperty(CLS级,为const char *名,常量objc_property_attribute_t *属性,无符号整型attributeCount)

参数

CLS

这个类进行修改。

该属性的名称。

属性

物业数组属性。

attributeCount

中的属性数目的属性。

返回值

是的,如果该属性已成功添加; 否则NO(例如,这个函数返回NO,如果该类已经拥有该属性)。

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • class_replaceProperty

宣称

objc / runtime.h

class_addProtocol

增加了一个协议,一个类。

布尔class_addProtocol(CLS级,协议*协议)

参数

CLS

这个类进行修改。

outCount

该协议添加到CLS。

返回值

YES如果协议被成功添加,否则编号(例如,类已符合该协议)。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_conformsToProtocol

返回一个布尔值,表示一个类是否符合给定的协议。

布尔class_conformsToProtocol(CLS级,协议*协议)

参数

CLS

类要检查。

协议

的协议。

返回值

是的,如果CLS符合协议,否则

讨论

你通常应该使用NSObject的conformsToProtocol:代替此功能的方法。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_copyIvarList

描述一个类中声明的实例变量。

伊瓦尔·class_copyIvarList(CLS级,无符号整型* outCount)

参数

CLS

该类检查。

outCount

在返回时,包含了返回的数组的长度。如果outCount是,是不是返回的长度。

返回值

伊瓦类型的指针,描述了类声明的实例变量的数组。由超声明的实例变量不包括在内。该数组包含* outCount指针后跟一个终止符。您必须释放与阵列免费的() 

如果类没有声明实例变量,或者CLSNULL,则返回和* outCount0

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_copyMethodList

描述了一个类实现的实例方法。

方法* class_copyMethodList(CLS级,无符号整型* outCount)

参数

CLS

类要检查。

outCount

在返回时,包含了返回的数组的长度。如果outCount是,是不是返回的长度。

返回值

类型的指针数组的方法不包含说明通过超类实现的类的任何实例方法实现的实例方法。该数组包含* outCount指针后跟一个终止符。您必须释放与阵列免费的() 

如果CLS没有实现的实例方法,或者CLS是,则返回空值* outCount0

讨论

为了得到一个类的类的方法,使用class_copyMethodList(object_getClass(CLS),及计数)

要获取方法的实现,可以通过父类来实现,使用class_getInstanceMethodclass_getClassMethod

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_copyPropertyList

描述一个类中声明的属性。

objc_property_t * class_copyPropertyList(CLS级,无符号整型* outCount)

参数

CLS

类要检查。

outCount

在返回时,包含了返回的数组的长度。如果outCount是,是不是返回的长度。

返回值

类型的指针数组objc_property_t描述的类声明的属性。不包括超类中声明的所有属性。该数组包含* outCount指针后跟一个终止符。您必须释放与阵列免费的() 

如果CLS声明没有属性,或者CLS是,则返回空值* outCount0

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_copyProtocolList

描述了通过一个类的协议。

协议** class_copyProtocolList(CLS级,无符号整型* outCount)

参数

CLS

类要检查。

outCount

在返回时,包含了返回的数组的长度。如果outCount是,是不是返回的长度。

返回值

类型的指针数组协议*说明通过类的协议。采用超或其他协议的任何协议不包括在内。该数组包含* outCount指针后跟一个终止符。您必须释放与阵列免费的() 

如果CLS采用无协议或CLS是,则返回空值* outCount0

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_createInstance

创建一个类的实例,这个类在默认的malloc内存区分配内存。

ID class_createInstance(CLS级,为size_t extraBytes)

参数

CLS

要分配的一个实例的类。

extraBytes

一个整数,指示的额外字节数来分配。中的附加字节可以被用于存储以外的类定义中所定义的附加的实例变量。

返回值

这个类的一个实例CLS。

空房

  • 可在OS X 10.0版和更高版本。

另请参阅

  • objc_constructInstance

宣称

objc / runtime.h

class_getClassMethod

返回一个指针,指向的数据结构描述为一个给定的类指定类方法。

方法class_getClassMethod(类类的一个,SEL aSelector)

参数

ACLASS

一个指针,指向一个类定义。通过包含您要检索的方法的类。

aSelector

类型的指针SEL。传给你要检索的方法的选择。

返回值

一个指针,指向的方法对应于由指定的选择器的实现数据结构aSelector由指定的类类的一个或NULL,如果指定的类或者它的超类不包含的类的方法用指定的选择。

讨论

请注意,此功能搜索超供实现,而class_copyMethodList没有。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

class_getClassVariable

返回伊瓦尔对于给定的类的指定类变量。

伊瓦尔class_getClassVariable(CLS级,为const char *名)

参数

CLS

类定义的类变量,你希望获得。

来获得类的变量定义的名称。

返回值

一个指针,指向一个伊瓦尔包含有关所指定的类变量信息的数据结构的名称

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getImageName

返回动态库中的类源自的名称。

为const char * class_getImageName(CLS级)

参数

CLS

您询问的类。

返回值

C字符串表示包含该库的名称CLS级。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getInstanceMethod

返回指定实例方法对于给定的类。

方法class_getInstanceMethod(类类的一个,SEL aSelector)

参数

ACLASS

类要检查。

aSelector

要检索的方法的选择。

返回值

对应于由指定的选择器的实现方法aSelector由指定的类类的一个或NULL,如果指定的类或者它的超类不包含的实例方法使用指定的选择。

讨论

请注意,此功能搜索超供实现,而class_copyMethodList没有。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

class_getInstanceSize

返回一个类的实例的大小。

为size_t class_getInstanceSize(CLS级)

参数

CLS

一个Class对象。

返回值

在类的实例的字节大小CLS,或者0,如果CLS是

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getInstanceVariable

返回伊瓦尔对于给定的类的指定实例变量。

伊瓦尔class_getInstanceVariable(CLS级,为const char *名)

参数

CLS

这个类的实例变量,你希望获得。

获取实例变量定义的名称。

返回值

一个指针,指向一个伊瓦尔包含有关被指定的实例变量信息的数据结构的名称

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

class_getIvarLayout

返回的描述伊瓦尔布局对于一个给定的类。

为const char * class_getIvarLayout(CLS级)

参数

CLS

该类检查。

返回值

的描述伊瓦布局CLS。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getMethodImplementation

返回的函数指针,如果一个特定的消息被发送到一个类的实例,将被调用。

进出口class_getMethodImplementation(CLS级,SEL名)

参数

CLS

类要检查。

一个选择。

返回值

函数指针,如果那被称为[对象名称]被称为与类的实例,或者为NULL,如果CLS是

讨论

class_getMethodImplementation可能比快method_getImplementation(class_getInstanceMethod(CLS,名称)) 

返回的函数指针可能是内部的运行,而不是一个实际的方法实现的功能。例如,如果该类的实例不来选择响应,返回的函数指针将是运行时的消息转发机制的一部分。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getMethodImplementation_stret

返回的函数指针,如果一个特定的消息被发送到一个类的实例,将被调用。

进出口class_getMethodImplementation_stret(CLS级,SEL名)

参数

CLS

类要检查。

一个选择。

返回值

函数指针,如果那被称为[对象名称]被称为与类的实例,或者为NULL,如果CLS是

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getName

返回类的名称。

为const char * class_getName(CLS级)

参数

CLS

一个Class对象。

返回值

类的名称,或者空字符串CLS是

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getProperty

返回与给定类的给定名称的属性。

objc_property_t class_getProperty(CLS级,为const char *名)

返回值

类型的指针objc_property_t描述性,或,如果类没有使用该名称,或者声明一个属性为NULL,如果CLS是

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getSuperclass

返回一个类的父类。

类class_getSuperclass(CLS级)

参数

CLS

一个Class对象。

返回值

该类的超类,或,如果CLS是根类,或,如果CLS是

讨论

你通常应该使用NSObject的超类来代替这一功能的方法。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_getVersion

返回一个类定义的版本号。

INT class_getVersion(类theClass描述)

参数

theClass描述

一个指针,指向一个的数据结构。通过对您想要获取版本的类的定义。

返回值

的整数,指示在类定义的版本号。

讨论

您可以使用类定义的版本号为您的类代表其他类接口的版本。这是用于对象序列特别有用(即,在一个扁平的形式的对象的归档),在那里它的变化认识到在不同的类定义版本的实例变量的布局是非常重要的。

从基础架构派生类NSObject的类可以获取使用的类定义版本号的getVersion类方法,它是利用实施class_getVersion功能。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

class_getWeakIvarLayout

返回弱布局的描述伊瓦尔为了一个给定的类。

为const char * class_getWeakIvarLayout(CLS级)

参数

CLS

该类检查。

返回值

弱布局的描述伊瓦 S代表CLS。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_isMetaClass

返回一个布尔值,表示一个类对象是否是一个元类。

布尔class_isMetaClass(CLS级)

参数

CLS

一个Class对象。

返回值

是的,如果CLS是一个元类,NO,如果CLS是一种非Meta类,NO,如果CLS是

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_replaceMethod

替换为一个给定的类中的方法的实现。

进出口class_replaceMethod(CLS级,SEL名,IMP IMP,为const char *类型)

参数

CLS

类要修改。

选择器是标识要替换它的实现方法。

IMP

新的实现对于所确定的方法名称所标识的类CLS。

类型

描述的参数的类型的方法,字符数组。对于可能的值,看Objective-C的运行时编程指南 > “输入编码”。因为该函数必须至少有两个arguments- 自我_cmd,第二和第三个字符必须是“ @ “ (第一个字符是返回类型)。

返回值

以前的实现所确定的方法的名字所标识的类CLS。

讨论

这个函数的作用有两种不同的方式:

  • 如果确定该方法的名称不存在,它被添加仿佛class_addMethod被称为。通过所指定的类型的编码类型被用作给定。
  • 如果确定了该方法的名字存在,其IMP被替换仿佛method_setImplementation被调用。通过指定类型的编码类型被忽略。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_replaceProperty

替换类的属性。

无效class_replaceProperty(CLS级,为const char *名,常量objc_property_attribute_t *属性,无符号整型attributeCount)

参数

CLS

这个类进行修改。

该属性的名称。

属性

物业数组属性。

attributeCount

中的属性数目的属性。

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • class_addProperty

宣称

objc / runtime.h

class_respondsToSelector

返回一个布尔值,表示一个类的实例是否在一个特定的选择做出回应。

布尔class_respondsToSelector(CLS级,SEL SEL)

参数

CLS

类要检查。

SEL

一个选择。

返回值

是的,如果该类的实例响应选择,否则

讨论

你通常应该使用NSObject的respondsToSelector:instancesRespondToSelector:方法代替此功能。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_setIvarLayout

设置伊瓦尔对于一个给定的类布局。

无效class_setIvarLayout(CLS级,为const char *布局)

参数

CLS

这个类进行修改。

布局

的布局伊瓦 S代表CLS。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

class_setVersion

设置一个类定义的版本号。

无效class_setVersion(类theClass描述,诠释的版本)

参数

theClass描述

一个指针,指向一个的数据结构。通过要为其设置版本的类的定义。

版本

一个整数。通过类定义的新的版本号。

讨论

您可以使用类定义的版本号为您的类代表其他类接口的版本。这是用于对象序列特别有用(即,在一个扁平的形式的对象的归档),在那里它的变化认识到在不同的类定义版本的实例变量的布局是非常重要的。

从基础架构派生类NSObject的类可以使用设置类定义的版本号setVersion中:类方法,它是利用实施class_setVersion功能。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

class_setWeakIvarLayout

设置为弱的布局伊瓦尔为了一个给定的类。

无效class_setWeakIvarLayout(CLS级,为const char *布局)

参数

CLS

这个类进行修改。

布局

弱布局伊娃 S代表CLS。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

imp_getBlock

返回与相关的块IMP使用创建的imp_implementationWithBlock

ID imp_getBlock(IMP anImp)

参数

anImp

公司调用该块。

返回值

调用块anImp。

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • imp_implementationWithBlock

宣称

objc / runtime.h

imp_implementationWithBlock

创建一个指向函数的指针调用时调用该方法的指定块。

进出口imp_implementationWithBlock(ID块)

参数

实现此方法的程序段。签名块应method_return_type ^(ID自我,自我,method_args …) 。该方法的选择是不提供给方框。块被复制与Block_copy() 

返回值

公司调用块。你必须处理返回的进出口使用的功能。

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • imp_getBlock

宣称

objc / runtime.h

imp_removeBlock

解除关联从一个块IMP使用创建的imp_implementationWithBlock,并释放所创建的块的副本。

布尔imp_removeBlock(IMP anImp)

参数

anImp

一个IMP使用创建的imp_implementationWithBlock功能。

返回值

是的,如果该块被成功释放; 否则,编号(例如,该函数返回NO如果块没有被用来创建anImp以前)。

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • imp_implementationWithBlock

宣称

objc / runtime.h

ivar_getName

返回一个实例变量的名称。

为const char * ivar_getName(伊娃伊娃)

返回值

C字符串包含实例变量的名字。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

ivar_getOffset

实例变量返回的偏移量。

ptrdiff_t的ivar_getOffset(伊娃伊娃)

讨论

对于类型的实例变量标识或其他对象的类型,调用object_getIvarobject_setIvar使用该偏移量来直接访问该实例变量的数据来代替。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

ivar_getTypeEncoding

返回一个实例变量的类型的字符串。

为const char * ivar_getTypeEncoding(伊娃伊娃)

返回值

C字符串包含实例变量的类型编码。

讨论

对于可能的值,看Objective-C的运行时编程指南 > “输入编码”。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_copyArgumentType

返回描述方法的一个参数类型的字符串。

char *的method_copyArgumentType(方法方法,无符号整型指数)

参数

方法

该方法检查。

指数

该参数的索引进行检查。

返回值

C字符串描述参数的索引类型索引,或者为NULL,如果方法没有参数指标指数。您必须释放字符串免费的() 

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_copyReturnType

返回描述方法的返回类型的字符串。

char *的method_copyReturnType(法法)

参数

方法

该方法检查。

返回值

C字符串描述返回类型。您必须释放字符串免费的() 

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_exchangeImplementations

交流两种方法的实现。

无效method_exchangeImplementations(方法M1,M2的方法)

讨论

这是下面的一个原子的版本:

进出口IMP1 = method_getImplementation(M1);

进出口IMP2 = method_getImplementation(M2);

method_setImplementation(M1,IMP2);

method_setImplementation(M2,IMP1);

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_getArgumentType

返回参照描述方法的一个参数类型的字符串。

无效method_getArgumentType(方法方法,unsigned int类型的索引,char *的DST,为size_t dst_len)

讨论

参数类型的字符串复制到DST,DST充满仿佛函数strncpy(DST,parameter_type,dst_len)被调用。如果该方法包含与该指数没有参数,DST充满仿佛函数strncpy(DST,“”,dst_len)被调用。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_getDescription

返回的方法描述结构的特定方法。

结构objc_method_description * method_getDescription(方法M)

参数

该方法要打听。

返回值

一个objc_method_description结构,描述根据指定的方法米。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_getImplementation

返回一个方法的实现。

进出口method_getImplementation(法法)

参数

方法

该方法检查。

返回值

类型的函数指针进出口

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_getName

返回一个方法的名称。

SEL method_getName(法法)

参数

方法

该方法检查。

返回值

SEL类型的指针。

讨论

要获取方法的名称为C字符串,调用sel_getName(method_getName(法)) 

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_getNumberOfArguments

返回由法接受的参数的个数。

无符号method_getNumberOfArguments(法法)

参数

方法

一个指向方法的数据结构。通过有问题的方法。

返回值

包含由给定的方法接受的参数数量的整数。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

method_getReturnType

通过引用返回一个描述方法的返回类型的字符串。

无效method_getReturnType(方法方法,char *的DST,为size_t dst_len)

讨论

该方法的返回类型为字符串复制到夏令时,夏令时是充满仿佛函数strncpy(DST,parameter_type,dst_len)被调用。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_getTypeEncoding

返回描述方法的参数和返回类型的字符串。

为const char * method_getTypeEncoding(法法)

参数

方法

该方法检查。

返回值

C字符串。该字符串可以是NULL

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

method_invoke

调用指定的方法的实现。

ID method_invoke(ID接收器,法米,…)

参数

接收器

一个指针,指向要调用的方法的类的实例。这个值不能为零

该方法要调用它的实现。

……

可变参数列表包含参数的方法。

返回值

该方法的返回值。

讨论

使用此功能来调用一个方法的实现比调用更快method_getImplementationmethod_getName

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / message.h

method_invoke_stret

调用指定的方法,返回一个数据结构的实现。

无效method_invoke_stret(ID接收器,法米,…)

参数

接收器

一个指针,指向要调用的方法的类的实例。这个值不能为零

该方法要调用它的实现。

……

可变参数列表包含参数的方法。

讨论

使用此功能来调用一个方法的实现比调用更快method_getImplementationmethod_getName

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / message.h

method_setImplementation

设置一个方法的实现。

进出口method_setImplementation(方法方法,IMP IMP)

返回值

以前的实施方法。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_allocateClassPair

创建一个新的类和元类。

objc_allocateClassPair(父类,为const char *名,为size_t extraBytes)

参数

类为新类的超类使用,或以创建一个新的根类。

将字符串作为新的类的名称使用。该字符串将被复制。

extraBytes

的字节数来分配的索引实例变量在类与元类对象的结束。这通常应为0

返回值

新的类,或者如果不能创建的类(例如,所需的名称已被使用)。

讨论

你可以通过调用得到一个指向新的元类object_getClass(的NewClass) 

要创建一个新的类,通 过调用启动objc_allocateClassPair。然后设置类的属性与像功能class_addMethodclass_addIvar。当您完成建设类,调用objc_registerClassPair。新类是现在可以使用了。

实例方法和实例变量应该被添加到类本身。类的方法应该被添加到元类。

空房

  • 可在OS X V10.5及更高版本。

另请参阅

  • objc_disposeClassPair

宣称

objc / runtime.h

objc_allocateProtocol

创建一个新的协议实例。

协议* objc_allocateProtocol(为const char *名)

参数

你要创建的协议的名称。

返回值

一个新的协议实例或,如果使用相同的名称作为协议的名称已经存在。

讨论

您必须注册到返回的协议实例objc_registerProtocol功能,然后才能使用它。

没有与此功能相关联的dispose方法。

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • objc_registerProtocol

宣称

objc / runtime.h

objc_constructInstance

在指定位置创建一个类的实例。

ID objc_constructInstance(CLS级,无效*字节)

参数

CLS

要分配的一个实例的类。

字节

在该分配的实例的位置CLS级。字节神秘岛点至少class_getInstanceSize(CLS)以及对齐,零填充的内存字节。

返回值

这个类的一个实例CLS的字节数,如果成功; 否则为零(例如,如果CLS或字节本身是)。

空房

  • 可在OS X v10.6中及更高版本。

另请参阅

  • class_createInstance

宣称

objc / runtime.h

objc_copyClassList

创建并返回指向所有注册类定义的列表。

类* objc_copyClassList(无符号整数* outCount)

参数

outCount

一个整数的指针,用来存储在列表中该函数返回类的数量。此参数可以是

返回值

á 终止的类数组。您必须释放与阵列免费的() 

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • objc_getClassList

宣称

objc / runtime.h

objc_copyClassNamesForImage

返回在指定库或框架的所有类的名称。

为const char ** objc_copyClassNamesForImage(为const char *的图像,无符号整型* outCount)

参数

图片

库或框架,你打听。

outCount

返回的数组中的类名的数量。

返回值

C字符串代表了所有指定的库或框架中的类名数组。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_copyImageNames

返回所有已加载的Objective-C框架和动态库的名字。

为const char ** objc_copyImageNames(无符号整数* outCount)

参数

outCount

返回的数组中人名的数目。

返回值

C字符串表示所有已加载的Objective-C框架和动态库的名称的数组。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_copyProtocolList

返回所有已知的运行协议的数组。

协议** objc_copyProtocolList(无符号整数* outCount)

参数

outCount

返回时,包含返回的数组中的协议数量。

返回值

交流阵列中所有已知的运行时的协议。该数组包含* outCount指针后跟一个终止符。您必须释放列表免费的() 

讨论

这个函数获取运行时锁定。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_destructInstance

销毁一个类的实例没有释放内存,并删除任何相关参考资料。

无效objc_destructInstance(ID OBJ)

讨论

此方法不执行任何操作,如果OBJ是

重要提示:  在垃圾回收器不会调用这个函数。因此,如果你编辑这个功能,你应该也可以编辑完成。也就是说,核心基金及其他客户做的叫垃圾收集下此功能。

空房

  • 可在OS X v10.6中及更高版本。

另请参阅

  • objc_constructInstance

宣称

objc / runtime.h

objc_disposeClassPair

破坏类及其相关的元类。

无效objc_disposeClassPair(CLS级)

参数

CLS

该类被破坏。这个类必须已经使用分配objc_allocateClassPair

讨论

不要调用这个函数,如果实例CLS存在的类或任何子类。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_duplicateClass

用基金会的键 – 值观察。

objc_duplicateClass

特别注意事项

不要自己调用这个函数。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_enumerationMutation

通过在一个foreach循环中检测到突变的编译器插入。

无效objc_enumerationMutation(ID OBJ)

参数

OBJ

对象被突变。

讨论

编译器插入此功能检测到的对象是一个foreach迭代过程中发生突变的时候。当变异发生在函数被调用,如果它被设置(通过枚举突变处理程序制定objc_setEnumerationMutationHandler功能)。如果处理器没有建立起来,出现致命错误。

空房

  • 可在OS X V10.5及更高版本。

另请参阅

  • objc_setEnumerationMutationHandler

宣称

objc / runtime.h

objc_getAssociatedObject

返回与给定键的特定对象关联的值。

ID objc_getAssociatedObject(ID对象,空白*键)

参数

对象

源对象的关联。

关键

密钥对的关联。

返回值

与该键相关联的值键为对象。

空房

  • 可在OS X v10.6中及更高版本。

另请参阅

  • objc_setAssociatedObject

宣称

objc / runtime.h

objc_getClass

返回指定类的类定义。

ID objc_getClass(为const char *名)

参数

来查找类的名称。

返回值

已命名的类的Class对象,或如果类不与Objective-C的运行时注册。

讨论

objc_getClass不同于objc_lookUpClass中,如果类没有注册,objc_getClass调用类的处理程序回调,然后检查第二次看有无类被注册。objc_lookUpClass不会调用类的处理程序回调。

特别注意事项

此功能(之前到OS X 10.0版)的早期实现终止程序如果类不存在。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

objc_getClassList

获得注册的类定义的列表。

INT objc_getClassList(等级*缓冲区,诠释bufferLen)

参数

缓冲区

数组的值。在输出时,每一的值指向一个类定义,最多为bufferLen或注册类别的总数,以较低者为准。您可以通过获得注册的类定义的总数没有实际获取的任何类定义。

bufferLen

一个整数值。传已为其在分配空间的指针数的缓冲区。在返回时,该函数将填充元件仅这个号码。如果这个数小于注册的类的数量,则该函数返回注册类的任意子集。

返回值

一个整数值,指示注册的类的总数量。

讨论

在Objective-C的运行时库会自动记录所有在源代码中定义的类。你可以在运行时创建的类的定义,并与注册它们objc_addClass功能。

清单1展示了如何使用这个功能来检索所有已注册在当前进程中的Objective-C运行时的类定义。

清单1   使用objc_getClassList

INT numClasses;

类*类= NULL;

 

类= NULL;

numClasses = objc_getClassList(NULL,0);

 

如果(numClasses> 0)

{

    班= malloc的(大小(类)* numClasses);

    numClasses = objc_getClassList(类,numClasses);

    免费(类);

}

特别注意事项

你不能假设你从这个函数获得这个类的对象是来自继承的类NSObject的,所以你不能安全地呼吁这样的类的任何方法,而没有检测方法,首先实现的。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

objc_getFutureClass

使用CoreFoundation的免费桥接。

类objc_getFutureClass(为const char *名)

特别注意事项

不要自己调用这个函数。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_getMetaClass

返回指定类的元类的定义。

ID objc_getMetaClass(为const char *名)

参数

来查找类的名称。

返回值

类别的命名类的元类对象,或者为零如果类不与Objective-C的运行时注册。

讨论

如果对于指定的类的定义中未注册,则该函数调用的类的处理程序的回调,然后检查第二时间,以查看是否在类中注册。然而,每一个类都必须有一个有效的元类的定义,所以元类的定义总是返回,无论是合法与否。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

objc_getProtocol

返回指定的协议。

协议* objc_getProtocol(为const char *名)

参数

协议的名称。

返回值

指定的协议的名称,或,如果没有指定协议名称可能会被发现。

讨论

这个函数获取运行时锁定。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_getRequiredClass

返回指定类的类定义。

ID objc_getRequiredClass(为const char *名)

参数

来查找类的名称。

返回值

Class对象的命名类。

讨论

这个功能是一样的objc_getClass,但终止进程,如果没有找到这个类。

这个函数由ZeroLink,其中没有找到一类是没有ZeroLink编译时链接错误。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

objc_loadWeak

加载由弱指针引用的对象并返回它。

ID objc_loadWeak(ID *位置)

参数

位置

弱指针的地址。

返回值

该对象所指向的位置,或,如果位置是

讨论

该功能通过加载一个弱指针引用的对象,保留和自动释放该对象后返回。其结果是,该对象保持活着足够长的主叫用户来使用它。这个功能通常用于任何地方__weak变量用于在表达式。

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

objc_lookUpClass

返回指定类的类定义。

ID objc_lookUpClass(为const char *名)

参数

来查找类的名称。

返回值

已命名的类的Class对象,或如果类不与Objective-C的运行时注册。

讨论

objc_getClass是从这个函数不同,如果这个类没有注册,objc_getClass调用类的处理程序回调,然后检查第二次看有无类被注册。该函数不调用类的处理程序回调。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

objc_msgSend

发送一个简单的返回值的消息,一个类的实例。

ID objc_msgSend(ID自我,SEL运算,…)

参数

一个指针,指向类的要接收消息的实例。

OP

在处理该信息的方法的选择。

……

可变参数列表包含参数的方法。

返回值

该方法的返回值。

讨论

当它遇到一个方法调用时,编译器会生成调用的功能之一objc_msgSendobjc_msgSend_stretobjc_msgSendSuperobjc_msgSendSuper_stret。发送到对象的超类的消息(使用关键字)使用的是发送objc_msgSendSuper ; 其他消息使用发送objc_msgSend。有数据结构作为返回值的方法是使用发送objc_msgSendSuper_stretobjc_msgSend_stret

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / message.h

objc_msgSendSuper

发送一个消息,一个简单的返回值的类的实例的超类。

ID objc_msgSendSuper(结构objc_super *超,SEL运算,…)

参数

一个指针,指向一个objc_super数据结构。传递值确定邮件发送给包括要接收消息和超在其开始搜索的方法实现的类的实例的上下文。

OP

类型的指针SEL。通过将处理该信息的方法的选择。

……

可变参数列表包含参数的方法。

返回值

确定了该方法的返回值的运算。

讨论

当它遇到一个方法调用时,编译器会生成调用的功能之一objc_msgSendobjc_msgSend_stretobjc_msgSendSuperobjc_msgSendSuper_stret。发送到对象的超类的消息(使用关键字)使用的是发送objc_msgSendSuper ; 其他消息使用发送objc_msgSend。有数据结构作为返回值的方法是使用发送objc_msgSendSuper_stretobjc_msgSend_stret

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / message.h

objc_msgSendSuper_stret

发送消息与数据结构返回值的类的实例的超类。

无效objc_msgSendSuper_stret(结构objc_super *超,SEL运算,…)

参数

一个指针,指向一个objc_super数据结构。传递值确定邮件发送给包括要接收消息和超在其开始搜索的方法实现的类的实例的上下文。

OP

类型的指针SEL。通过该方法的选择。

……

可变参数列表包含参数的方法。

讨论

当它遇到一个方法调用时,编译器会生成调用的功能之一objc_msgSendobjc_msgSend_stretobjc_msgSendSuperobjc_msgSendSuper_stret。发送到对象的超类的消息(使用关键字)使用的是发送objc_msgSendSuper ; 其他消息使用发送objc_msgSend。有数据结构作为返回值的方法是使用发送objc_msgSendSuper_stretobjc_msgSend_stret

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / message.h

objc_msgSend_fpret

发送消息浮点返回值的类的实例。

双objc_msgSend_fpret(ID自我,SEL运算,…)

参数

一个指针,指向类的要接收消息的实例。

OP

在处理该信息的方法的选择。

……

可变参数列表包含参数的方法。

讨论

在i386平台,ABI的功能为返回一个浮点数值与对函数返回一个整数类型不兼容。在i386平台,因此,您必须使用objc_msgSend_fpret的功能,对于函数返回非整数类型。对于浮动长双返回类型,施放功能,适当的函数指针类型第一。

这个功能没有被使用在PPC或PPC64平台。

空房

  • 可在OS X 10.4及更高版本。

宣称

objc / message.h

objc_msgSend_stret

发送一个数据结构,返回值的消息,一个类的实例。

无效objc_msgSend_stret(void *的stretAddr,ID theReceiver,SEL theSelector,…)

参数

stretAddr

在输入时,指针指向的内存足够大,以包含该方法的返回值的块。在输出时,包含该方法的返回值。

theReceiver

一个指针,指向类的实例,它是接收消息。

theSelector

类型的指针SEL。通过处理该信息的方法的选择。

……

可变参数列表包含参数的方法。

讨论

当它遇到一个方法调用时,编译器会生成调用的功能之一objc_msgSendobjc_msgSend_stretobjc_msgSendSuperobjc_msgSendSuper_stret。发送到对象的超类的消息(使用关键字)使用的是发送objc_msgSendSuper ; 其他消息使用发送objc_msgSend。有数据结构作为返回值的方法是使用发送objc_msgSendSuper_stretobjc_msgSend_stret

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / message.h

objc_registerClassPair

寄存器,使用分配的一类objc_allocateClassPair

无效objc_registerClassPair(CLS级)

参数

CLS

类要注册。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_registerProtocol

注册一个与Objective-C运行新创建的协议。

无效objc_registerProtocol(协议*原)

参数

该协议要与Objective-C的运行时进行登记。

讨论

当您创建使用一个新的协议objc_allocateProtocol,然后,通过调用这个函数的Objective-C的运行时注册它。经过协议成功注册,这是不可改变的,并准备使用。

空房

  • 可在OS X v10.7及更高版本。

另请参阅

  • objc_allocateProtocol

宣称

objc / runtime.h

objc_removeAssociatedObjects

删除给定对象的所有关联。

无效objc_removeAssociatedObjects(ID对象)

参数

对象

它维护相关联的对象的对象。

讨论

此功能的主要目的是可以很容易将对象返回到“原始状态”,你不应该使用这个函数从对象一般去除关联,因为它也消除了其他客户可能已添加到该对象关联。通常情况下,你应该使用objc_setAssociatedObject值,以清除关联。

空房

  • 可在OS X v10.6中及更高版本。

另请参阅

  • objc_setAssociatedObject
  • objc_getAssociatedObject

宣称

objc / runtime.h

objc_setAssociatedObject

设置使用给定的键和关联政策给定对象关联的值。

无效objc_setAssociatedObject(ID对象,空白*键,值id,objc_AssociationPolicy政策)

参数

对象

源对象的关联。

关键

密钥对的关联。

该值与密钥相关联的密钥的目的。通过无以清除现有的关联。

政策

该政策的相关性。对于可能的值,请参阅“关联对象的行为。”

空房

  • 可在OS X v10.6中及更高版本。

另请参阅

  • objc_setAssociatedObject
  • objc_removeAssociatedObjects

宣称

objc / runtime.h

objc_setEnumerationMutationHandler

设置电流突变处理。

无效objc_setEnumerationMutationHandler(无效(*处理器)(ID))

参数

处理程序

函数指针到新的变异处理程序。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_setFutureClass

使用CoreFoundation的免费桥接。

无效objc_setFutureClass(CLS级,为const char *名)

特别注意事项

不要自己调用这个函数。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

objc_storeWeak

存储在一个新值__weak变量。

ID objc_storeWeak(ID *的位置,ID OBJ)

参数

位置

弱指针的地址。

OBJ

新的对象,你要弱指针现在指向。

返回值

存储在所述值的位置(即,物镜)。

讨论

此功能通常用于任何地方__weak变量赋值的目标。

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

object_copy

返回给定对象的副本。

ID object_copy(ID OBJ,为size_t大小)

参数

OBJ

一个Objective-C的对象。

大小

对象的大小物镜。

返回值

副本OBJ。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

object_dispose

释放由给定对象占用的内存。

ID object_dispose(ID OBJ)

参数

OBJ

一个Objective-C的对象。

返回值

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

object_getClass

返回类的对象。

类object_getClass(ID对象)

参数

对象

对象要检查。

返回值

其中的类对象对象是一个实例,或如果对象是

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

object_getClassName

返回给定对象的类名。

为const char * object_getClassName(ID OBJ)

参数

OBJ

一个Objective-C的对象。

返回值

类,其中的名称物镜是一个实例。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

object_getIndexedIvars

返回一个指向分配一个实例给定对象的任何额外的字节。

OBJC_EXPORT无效* object_getIndexedIvars(ID OBJ)

参数

OBJ

一个Objective-C的对象。

返回值

一个指向分配任何额外的字节OBJ。如果OBJ没有被分配任何额外的字节,然后提领返回的指针是不确定的。

讨论

这个函数返回一个指向分配该实例的任何额外的字节(具体由class_createInstance与extraBytes> 0)。这个存储器如下物件的普通实例变量,但可能并不相邻于最后的ivar。

返回指针是保证指针尺寸对齐,即使下面的对象的最后的ivar的面积小于对准。比指针的大小对齐更大从未得到保证,即使下面的对象的最后的ivar的面积比更一致。

在垃圾收集环境中,内存扫描保守。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / objc.h

object_getInstanceVariable

获得一个类的实例的实例变量的值。

伊瓦尔object_getInstanceVariable(ID OBJ,为const char *名,空白** outValue)

参数

OBJ

一个指针,指向一个类的实例。通过含有该实例变量,其值要获取的对象。

C字符串。通过实例变量的值,你希望得到的名字。

outValue

在返回时,包含一个指向该实例变量的值。

返回值

的指针伊娃的数据结构,它定义了指定的实例变量的类型和名称的名称

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

object_getIvar

读一个实例变量中的对象的值。

ID object_getIvar(ID对象,伊娃伊娃)

参数

对象

包含实例变量要读取其值的对象。

伊娃

在伊瓦描述实例变量,你想读的价值。

返回值

由指定的实例变量的值伊娃,或者为零,如果对象是

讨论

object_getIvar比快object_getInstanceVariable如果已经知道伊娃的实例变量。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

object_setClass

设置类的对象的。

类object_setClass(ID对象,类CLS)

参数

对象

修改的对象。

SEL

一个Class对象。

返回值

以前的值对象的类,或者,如果对象是

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

object_setInstanceVariable

改变一个类的实例的实例变量的值。

伊瓦尔object_setInstanceVariable(ID OBJ,为const char *的名字,void *的值)

参数

OBJ

一个指针,指向一个类的实例。通过包含实例变量,它的值要修改的对象。

C字符串。通过实例变量,它的值要修改的名称。

对实例变量的新值。

返回值

的指针伊娃的数据结构,它定义了指定的实例变量的类型和名称的名称

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

object_setIvar

设置一个实例变量中的对象的值。

无效object_setIvar(ID对象,伊娃伊娃,值id)

参数

对象

包含实例变量要设置其值的对象。

伊娃

在伊瓦描述实例变量要设置其值。

对实例变量的新值。

讨论

object_setIvar比快object_setInstanceVariable如果已经知道伊娃的实例变量。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

property_copyAttributeList

返回属性的属性给定属性的数组。

objc_property_attribute_t * property_copyAttributeList(objc_property_t财产,无符号整型* outCount)

参数

物业

你要复制的属性,它的属性。

outCount

数组中返回的属性的数量。

返回值

物业数组属性。您必须释放与阵列免费的() 

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

property_copyAttributeValue

返回给定属性名称的属性属性的值。

char *的property_copyAttributeValue(objc_property_t财产,为const char *属性名称)

参数

物业

该物业的价值你感兴趣的内容。

属性名称

C字符串表示的属性的名称。

返回值

该值的字符串属性名称的属性,如果存在的财产 ; 否则,。您必须释放与返回值的字符串免费() 

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

property_getAttributes

返回一个属性的属性字符串。

为const char * property_getAttributes(objc_property_t属性)

返回值

C字符串包含属性的属性。

讨论

属性字符串的格式说明“,宣布属性”中的Objective-C运行时编程指南。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

property_getName

返回一个属性的名称。

为const char * property_getName(objc_property_t属性)

返回值

C字符串包含属性的名称。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_addMethodDescription

添加一个方法的协议。

无效protocol_addMethodDescription(协议*原,SEL名,为const char *类型,布尔isRequiredMethod,布尔isInstanceMethod)

参数

该协议要添加一个方法。

要添加的方法的名称。

类型

交流字符串,表示要添加的方法的签名。

isRequiredMethod

布尔值,表示该方法是必需的方法原协议。如果为是,则该方法是必需的方法; 若,该方法是可选的方法。

isInstanceMethod

布尔表示方法是否是一个实例方法。如果为是,则该方法是一个实例方法; 若,该方法是一类方法。

讨论

要使用此功能的方法添加到协议中,协议必须是正在建设中。也就是说,你必须添加任何方法来原你的Objective-C的运行时(通过注册它之前objc_registerProtocol功能)。

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

protocol_addProperty

添加一个属性的协议正在建设中。

无效protocol_addProperty(协议*原,为const char *名,常量objc_property_attribute_t *属性,无符号整型attributeCount,布尔isRequiredProperty,布尔isInstanceProperty)

参数

该协议要添加属性。

你要添加的属性的名称。

属性

物业数组属性。

attributeCount

物业数量的属性。

isRequiredProperty

布尔值,表示该属性的访问器方法所需的方法原协议。如果,该属性的访问器方法所需的方法; 若,该属性的访问器方法是可选的方法。

isInstanceProperty

布尔值,表示该属性的访问器方法是实例方法。如果,该属性的访问器方法是实例方法。是允许的属性的唯一值。因此,如果您将此值设置为,则属性将不会被加入到协议。

讨论

该协议要添加的属性必须是正在建设中,拨出而尚未登记的Objective-C的运行时(通过objc_registerProtocol功能)。

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

protocol_addProtocol

增加了一个注册协议到另一个协议,正在建设中。

无效protocol_addProtocol(协议原*,*协议补充)

参数

该协议要注册协议加入。

此外

注册协议要添加到原。

讨论

要添加到(协议原)必须是正在建设中,拨出而尚未登记的Objective-C的运行时。要添加(该协议除)必须已经注册。

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

protocol_conformsToProtocol

返回一个布尔值,表示一个协议是否符合其他协议。

布尔protocol_conformsToProtocol(协议*原,协议*除外)

参数

的协议。

其他

的协议。

返回值

是的,如果原符合其他,否则

讨论

一个协议可以结合使用类使用采用协议相同的语法其他协议:

@protocol ProtocolName <协议列表>

所有角括号之间列出的协议被认为是ProtocolName协议的一部分。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_copyMethodDescriptionList

返回满足给定的规范给定的协议方法方法描述的数组。

结构objc_method_description * protocol_copyMethodDescriptionList(协议* P,布尔isRequiredMethod,布尔isInstanceMethod,无符号整型* outCount)

参数

p

的协议。

isRequiredMethod

一个布尔值,表示返回的方法有否需要的方法(通过可以指定所需的方法)。

isInstanceMethod

一个布尔值,表示返回的方法是否应为实例方法(传递指定实例方法)。

outCount

返回时,包含的方法的描述结构的返回数组中的号码。

返回值

交流阵objc_method_description包含的名称和类型结构p通过指定的方式isRequiredMethod和isInstanceMethod。该数组包含* outCount指针后跟一个终止符。您必须释放列表免费的() 

如果协议没有声明符合规范的方法,NULL,则返回和* outCount0

讨论

在采用这个协议的其他协议的方法不包括在内。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_copyPropertyList

返回由协议中声明的属性的数组。

objc_property_t * protocol_copyPropertyList(协议*协议,无符号整型* outCount)

参数

的协议。

outCount

返回时,包含返回的数组中元素的个数。

返回值

交流数组类型的指针objc_property_t描述了声明的属性原。不包括通过该协议的其他协议中声明的任何属性。该数组包含* outCount指针后跟一个终止符。您必须释放与阵列免费的() 

如果协议没有声明的属性,NULL,则返回和* outCount0

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_copyProtocolList

返回所通过的协议的协议的数组。

协议** protocol_copyProtocolList(协议*原,无符号整型* outCount)

参数

的协议。

outCount

返回时,包含返回的数组中元素的个数。

返回值

交流阵列通过协议原。该数组包含* outCount指针后跟一个终止符。您必须释放与阵列免费的() 

如果协议没有声明的属性,NULL,则返回和* outCount0

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_getMethodDescription

返回指定给定的协议的方法的方法描述结构。

结构objc_method_description protocol_getMethodDescription(协议* P,SEL ASEL,布尔isRequiredMethod,布尔isInstanceMethod)

参数

p

的协议。

ASEL

选择器

isRequiredMethod

一个布尔值,表示是否ASEL是必需的方法。

isInstanceMethod

一个布尔值,表示是否ASEL是一个实例方法。

返回值

一个objc_method_description结构,描述根据指定的方法ASEL,isRequiredMethod和isInstanceMethod用于协议p。

如果该协议不包含所指定的方法,返回一个objc_method_description与价值结构{NULL,NULL} 

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_getName

返回一个协议的名称。

为const char * protocol_getName(协议* P)

参数

p

的协议。

返回值

该协议的名称p为C字符串。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_getProperty

返回给定协议的指定属性。

objc_property_t protocol_getProperty(协议*原,为const char *的名字,布尔isRequiredProperty,布尔isInstanceProperty)

参数

的协议。

一个属性的名称。

isRequiredProperty

一个布尔值,表示是否名字是必需的属性。

isInstanceProperty

一个布尔值,表示是否名字是实例属性。

返回值

该物业指定的名称,isRequiredProperty和isInstanceProperty为原,或NULL如果没有原始的属性是否符合规范。

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

protocol_isEqual

返回一个布尔值,表示两个协议是否相等。

布尔protocol_isEqual(协议*原,协议*除外)

参数

的协议。

其他

的协议。

返回值

是的,如果原相同等,否则

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

sel_getName

返回由给定的选择器指定的方法的名称。

为const char * sel_getName(SEL aSelector)

参数

aSelector

类型的指针SEL。通过他的名字,你想确定选择。

返回值

C字符串表示选择器的名称。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

sel_getUid

注册到Objective-C的运行时系统的方法名。

SEL sel_getUid(为const char * str中)

参数

海峡

一个指针,指向一个C字符串。传给你要注册的方法的名称。

返回值

类型的指针SEL指定选择器的命名方法。

讨论

该方法的实现是相同的实施sel_registerName

版本说明

在此之前的OS X 10.0版本,这个方法试图找到选择映射到给定的名称,返回NULL,如果没有找到选择。这对安全性进行了改变,因为它指出,许多这个函数的调用者没有检查返回值NULL

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / objc.h

sel_isEqual

返回一个布尔值,表示两个选择是否相等。

布尔sel_isEqual(SEL LHS,SEL RHS)

参数

LHS

选择与比较RHS。

RHS

选择与比较LHS。

返回值

是的,如果RHS和RHS是平等的,否则

讨论

sel_isEqual相当于==

空房

  • 可在OS X V10.5及更高版本。

宣称

objc / runtime.h

sel_registerName

注册到Objective-C的运行时系统的方法,映射方法名选择器,并返回选择值。

SEL sel_registerName(为const char * str中)

参数

海峡

一个指针,指向一个C字符串。传给你要注册的方法的名称。

返回值

类型的指针SEL指定选择器的命名方法。

讨论

您必须注册一个方法名与Objective-C的运行时系统,以获得该方法的选择之前,你可以添加方法的类的定义。如果方法名称已被注册,该函数只返回选择。

空房

  • 可在OS X 10.0版和更高版本。

宣称

objc / runtime.h

数据类型

类定义的数据结构

不透明类型,表示一个Objective-C类。

typedef结构objc_class *级;

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / objc.h

方法

不透明类型,表示一个类定义的方法。

typedef结构objc_method *方法;

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / runtime.h

伊瓦尔

不透明类型,代表了一个实例变量。

typedef结构objc_ivar *伊瓦尔;

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / runtime.h

分类

不透明类型,代表一个类别。

typedef结构objc_category *类别;

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / runtime.h

objc_property_t

不透明类型,代表了Objective-C中声明的属性。

typedef结构objc_property * objc_property_t;

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / runtime.h

进出口

一个指针,指向的方法实施的开始。

ID(* IMP)(身份证,SEL,…)

讨论

这个数据类型为指针,以实现该方法的功能的启动。该功能使用标准C调用约定,实现当前的CPU架构。第一个参数是指向自我(也就是这个类,或者对于一个类的方法,一个指向元类的特定实例的内存)。第二个参数是方法选择。该方法的参数如下。

SEL

定义一个不透明的类型表示的方法选择。

typedef结构objc_selector * SEL;

讨论

方法选择器被用来表示一个方法在运行时的名称。一种方法是选择已注册(或“映射”)与Objective-C运行C字符串。由编译器生成的选择器会自动运行时,当类被加载映射。

您可以在运行时添加新的选择和检索利用现有的功能选择sel_registerName

当使用选择器,您必须使用从返回的值sel_registerName或Objective-C的编译器指令@selector()。你不能简单地投了C字符串到SEL

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / objc.h

objc_method_description

定义一个Objective-C的方法。

结构objc_method_description {    SEL名;    char *的类型; };

该方法在运行时的名称。

类型

该类型的方法参数。

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / runtime.h

objc_method_list

包含方法定义的数组。

结构objc_method_list { 结构objc_method_list *过时; INT method_count; 结构objc_method method_list [1]; }

过时了

保留供将来使用。

method_count

一个整数,指定的方法清单阵列中的方法的数目。

method_list

数组方法的数据结构。

空房

  • 可在OS X V10.5及更高版本。
  • 不推荐使用的OS X v10.5中。
  • 不适用于64位应用程序。

宣称

objc / runtime.h

objc_cache

性能优化的方法调用。包含指向最近使用过的方法。

结构objc_cache { unsigned int的面具; unsigned int类型占用; 方法水桶[1]; };

面膜

一个整数,指定分配缓存桶(减一)的总数。在方法查找,在Objective-C的运行时使用此字段来确定其开始的线性搜索索引水桶阵。一个指针,指向一个方法的选择是使用逻辑与操作(屏蔽,这一领域的指数=(面具和选择器)) 。这可作为一个简单的散列算法。

占用

一个整数,指定所占用的缓存桶的总数。

指针数组方法的数据结构。该阵列可包含不超过面膜+ 1项。注意,指针可以是NULL,表示该高速缓冲桶是未占用的,并且占据桶可能不连续。该阵列可随着时间的推移。

讨论

要限制需要执行方法列出线性搜索经常访问的方法,操作的定义,可以大大减缓方法查找,在Objective-C的运行时函数指针存储在类中最近被调用方法的定义一个objc_cache数据结构。

objc_protocol_list

代表的正式协议的列表。

结构objc_protocol_list { 结构objc_protocol_list *旁边; 诠释计数; 协议*列表[1]; };

下一个

一个指向另一个objc_protocol_list数据结构。

在此列表中的协议的数目。

列表

指针数组代表协议的数据结构。

讨论

正式协议是一个类定义,声明了一组方法,其中的类必须实现。这样的类定义中没有实例变量。一个类定义可以保证实现任意数量的正式协议。

空房

  • 可在OS X v10.6中及更高版本。
  • 不适用于64位应用程序。

宣称

objc / runtime.h

objc_property_attribute_t

定义一个属性的属性。

typedef结构{    为const char *名称;    为const char *值; } objc_property_attribute_t;

该属性的名称。

该属性的值(通常为空)。

空房

  • 可在OS X v10.7及更高版本。

宣称

objc / runtime.h

例如数据类型

这些都是表示对象,类和超类的数据类型。

  • ID指向一个类的实例。
  • objc_object表示一个类的实例。
  • objc_super指定实例的父类。

ID

一个指针,指向一个类的实例。

typedef结构objc_object * ID;

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / objc.h

objc_object

表示一个类的实例。

结构objc_object {    ISA类; };

ISA

其中一个指针,指向类定义这个对象是一个实例。

讨论

当你创建一个特定的类的实例,所分配的内存中包含objc_object数据结构,它直接后跟类的实例变量的数据。

页头allocWithZone: Foundation框架类NSObject的方法使用功能class_createInstance创建objc_object数据结构。

objc_super

指定实例的父类。

结构objc_super { ID接收器; Class类; };

接收器

类型的指针ID。指定一个类的实例。

一个指针,指向一个的数据结构。指定实例消息的特定超。

讨论

编译器会生成objc_super数据结构遇到的时候关键字作为信息的接收者。它指定要传 递消息的特定超类的类定义。

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / message.h

布尔值

BOOL

类型来表示一个布尔值。

的typedef符号字符BOOL;

讨论

BOOL明确正式签订@encode(布尔)?而不是?即使-funsigned,字符被使用。

对于值,请参阅“布尔值”

特别注意事项

由于类型BOOL实际上是字符,它不表现在以同样的方式为C _Bool值或C + + 布尔值。例如,有条件的在下面的代码会是假的在i386(和真正的在PPC):

– (BOOL)值{

    返回256;

}

然后//

如果([个体值])doStuff();

相比之下,有条件的在下面的代码将在所有平台上(即使真正的sizeof(BOOL)== 1):

– (布尔)值{

    返回256;

}

然后//

如果([个体值])doStuff();

空房

  • 可在OS X 10.1及更高版本。

宣称

objc / objc.h

联想参考

objc_AssociationPolicy

输入到指定的关联的行为。

的typedef uintptr_t的objc_AssociationPolicy;

讨论

对于值,请参阅“关联对象的行为”

空房

  • 可在OS X v10.6中及更高版本。

宣称

objc / runtime.h

常量

布尔值

这些宏定义方便的常量来表示布尔值。

#定义是(BOOL)1 #定义编号(布尔)0

常量

定义1

可在OS X 10.0版和更高版本。

宣布在objc / objc.h

定义编号0

可在OS X 10.0版和更高版本。

宣布在objc / objc.h

宣称

objc.h

Null值

这些宏定义类和实例的空值。

#定义零__DARWIN_NULL #定义无__DARWIN_NULL

常量

定义ID空实例。

可在OS X 10.0版和更高版本。

声明中IONDRVLibraries.h

定义ID为空类。

可在OS X 10.0版和更高版本。

宣布在objc / objc.h

宣称

objc.h

调度函数原型

这个宏表示调度功能是否必须强制转换为相应的函数指针类型。

#定义OBJC_OLD_DISPATCH_PROTOTYPES 1

常量

OBJC_OLD_DISPATCH_PROTOTYPES

OBJC_OLD_DISPATCH_PROTOTYPES == 0强制执行调度功能必须强制转换为相应的函数指针类型的规则。

可在OS X v10.8及更高版本。

宣布在objc / objc-api.h

宣称

objc-api.h

Objective-C的根类

这个宏诠释的一类作为是一个Objective-C的根类。

#定义OBJC_ROOT_CLASS

常量

OBJC_ROOT_CLASS

如果你定义一个Objective-C的根类,您会收到一个编译错误,表明类没有指定基类中定义。您可以通过在根类的定义(也就是前前避免这个编译器错误@interface指令)与OBJC_ROOT_CLASS

可在OS X v10.9及更高版本。

宣布在objc / objc-api.h

宣称

objc-api.h

局部变量的存储时间

这个宏表示存储在特定的局部变量的值不应积极优化过程中释放的编译器。

#定义NS_VALID_UNTIL_END_OF_SCOPE

常量

NS_VALID_UNTIL_END_OF_SCOPE

标记类型的局部变量ID或指针到ObjC对象类型,以便存储到这些局部变量的值不积极优化过程中释放的编译器。相反,该值被保持,直到该变量被分配给一次,或局部变量的范围的端部(如在一个复合语句的方法或定义)。

可在OS X v10.8及更高版本。

声明中NSObjCRuntime.h

宣称

NSObjCRuntime.h

关联对象的行为

有关关联引用的政策。

枚举{    OBJC_ASSOCIATION_ASSIGN = 0,    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   OBJC_ASSOCIATION_RETAIN = 01401,    OBJC_ASSOCIATION_COPY = 01403 };

常量

OBJC_ASSOCIATION_ASSIGN

指定一个弱引用关联的对象。

可在OS X v10.6中及更高版本。

宣布在objc / runtime.h

OBJC_ASSOCIATION_RETAIN_NONATOMIC

指定的强引用关联的对象,以及该组织不以原子制成。

可在OS X v10.6中及更高版本。

宣布在objc / runtime.h

OBJC_ASSOCIATION_COPY_NONATOMIC

指定关联的对象被复制,以及该组织不以原子制成。

可在OS X v10.6中及更高版本。

宣布在objc / runtime.h

OBJC_ASSOCIATION_RETAIN

指定的强引用关联的对象,而该组织是原子制成。

可在OS X v10.6中及更高版本。

宣布在objc / runtime.h

OBJC_ASSOCIATION_COPY

指定关联的对象被复制,而该组织是原子制成。

可在OS X v10.6中及更高版本。

宣布在objc / runtime.h

以上是关于iOS面试—3runtime运行时的主要内容,如果未能解决你的问题,请参考以下文章

iOS 底层面试题

ios面试技术要点

[转]那些著名或非著名的iOS面试题(下)

精选面试题教你应对高级iOS开发面试官(提供底层进阶规划蓝图)

iOS面试题---Objective_C语言特性:分类扩展代理通知KVOKVC属性

iOS面试题---Objective_C语言特性:分类扩展代理通知KVOKVC属性