这是一篇浅显实用 易记 易理解的关于runtime的解读。
Runtime 中的方法主要以五个单词开头——class(类)、object(实例)、method(方法)、propert(属性)、ivar(成员变量)
它们代表了方法的操作对象,如class开头的
OBJC_EXPORT Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
__OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_2_0);
这个方法很吓人,有很多单词,一看脑子就疼,但大部分单词不是我们关心的,只提取中间一段
class_copyIvarList 这是一个方法名,它以class开头,说明它与class有关(class是类,objc是实例)
而在class(类)里我们可以得到什么呢,没有被实例化的话好像什么也不是。其实不是这样的。class是一个模版,属性、方法、成员变量的信息我们都可以从中获取。
我们再多分析一点
class_copyIvarList(Class cls, unsigned int *outCount) 这里列出了它需要的参数,一个class类和一个无符号的int类地址。
Ivar *class_copyIvarList(Class cls, unsigned int *outCount)方法前是它的返回类型,一个ivar类型。ivar类型是class类型成员变量的信息索引,而不是载体。例如我们可以这样获得成员变量名
const char* name = ivar_getName(ivar);
可以这样获得成员变量指向
id ivarContent = object_getIvar(self, ivar);
可以看到这都不是从ivar中直接取出来的,而是通过ivar用其他办法获得的。
这里我们又用到两个不同单词开头的方法 ——ivar、object。可以看到ivar开头的方法是用来取变量名字的,而object开头的方法接受了两个值——实例和变量索引(ivar类型),它从实例中拿出ivar索引代表的变量取出变量指向做返回值。