Runtime Class_xxx函数

接上篇文章Runtime 成员变量、属性及方法相关函数,其中的各个函数基本上都是无法单独使用的,需要配合一些 class_ 打头的函数。

下面,来讲一下这些 class_ 打头的函数,有些函数还会配合着上篇文中的函数一起使用。

函数描述

1. class_getName

OBJC_EXPORT const char * _Nonnull
class_getName(Class _Nullable cls) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

接收一个 Class 类型的参数,返回它的名称

2. class_isMetaClass

OBJC_EXPORT BOOL
class_isMetaClass(Class _Nullable cls) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

返回布尔值,判断cls是不是一个元类。关于元类的介绍

3. class_getSuperclass

OBJC_EXPORT Class _Nullable
class_getSuperclass(Class _Nullable cls) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 父类的类型。

4. class_setSuperclass 废弃

不做介绍

5. class_getVersion

OBJC_EXPORT int
class_getVersion(Class _Nullable cls)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 对应的版本号

6. class_setVersion

OBJC_EXPORT void
class_setVersion(Class _Nullable cls, int version)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
复制代码

设置 cls 对应的版本号

7. class_getInstanceSize

OBJC_EXPORT size_t
class_getInstanceSize(Class _Nullable cls) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 的内存大小。关于 class_getInstanceSize 更多的介绍,请查看sizeof、class_getInstanceSize、malloc_size的区别

8. class_getInstanceVariable

OBJC_EXPORT Ivar _Nullable
class_getInstanceVariable(Class _Nullable cls, const char * _Nonnull name)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 的指定成员变量的 Ivar

9. class_getClassVariable

OBJC_EXPORT Ivar _Nullable
class_getClassVariable(Class _Nullable cls, const char * _Nonnull name) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

它底层其实调用的就是 class_getInstanceVariable,但要说这个函数有什么用吧,还真没什么用。靠谱点的解释

10. class_copyIvarList

OBJC_EXPORT Ivar _Nonnull * _Nullable
class_copyIvarList(Class _Nullable cls, unsigned int * _Nullable outCount) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取当前所有的成员变量(不包括父类)

demo:

unsigned int outCount;
Ivar *ivarList = class_copyIvarList([CZPerson class], &outCount);
for (unsigned int i = 0; i < outCount; i++) {
    Ivar ivar = ivarList[i];
    NSLog(@"%s", ivar_getName(ivar));
}

free(ivarList);
复制代码

11. class_getInstanceMethod

OBJC_EXPORT Method _Nullable
class_getInstanceMethod(Class _Nullable cls, SEL _Nonnull name)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 指定的实例方法,包括父类

12. class_getClassMethod

OBJC_EXPORT Method _Nullable
class_getClassMethod(Class _Nullable cls, SEL _Nonnull name)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 指定的类方法,包括父类

13. class_getMethodImplementation

OBJC_EXPORT IMP _Nullable
class_getMethodImplementation(Class _Nullable cls, SEL _Nonnull name) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取方法的实现

14. class_getMethodImplementation_stret

OBJC_EXPORT IMP _Nullable
class_getMethodImplementation_stret(Class _Nullable cls, SEL _Nonnull name) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0)
    OBJC_ARM64_UNAVAILABLE;
复制代码

获取方法的实现,其返回值是一个结构体。

看下具体实现比较清楚

IMP class_getMethodImplementation_stret(Class cls, SEL sel)
{
    IMP imp = class_getMethodImplementation(cls, sel);

    // Translate forwarding function to struct-returning version
    if (imp == (IMP)&_objc_msgForward /* not _internal! */) {
        return (IMP)&_objc_msgForward_stret;
    }
    return imp;
}
复制代码

其实内部也是调用了 class_getMethodImplementation,将得到的结果转换为结构体返回

15. class_respondsToSelector

OBJC_EXPORT BOOL
class_respondsToSelector(Class _Nullable cls, SEL _Nonnull sel) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

返回一个布尔值,判断 cls 是否有 sel 对应的方法实现

16. class_copyMethodList

OBJC_EXPORT Method _Nonnull * _Nullable
class_copyMethodList(Class _Nullable cls, unsigned int * _Nullable outCount) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取有具体实现的实例方法(仅是声明的方法无法获取)

17. class_conformsToProtocol

OBJC_EXPORT BOOL
class_conformsToProtocol(Class _Nullable cls, Protocol * _Nullable protocol) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

返回一个布尔值,判断 cls 是否有有遵守 protocol 协议

18. class_copyProtocolList

OBJC_EXPORT Protocol * __unsafe_unretained _Nonnull * _Nullable 
class_copyProtocolList(Class _Nullable cls, unsigned int * _Nullable outCount)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 遵守的所有协议

19. class_getProperty

OBJC_EXPORT objc_property_t _Nullable
class_getProperty(Class _Nullable cls, const char * _Nonnull name)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取指定的属性

20. class_copyPropertyList

OBJC_EXPORT objc_property_t _Nonnull * _Nullable
class_copyPropertyList(Class _Nullable cls, unsigned int * _Nullable outCount)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

获取 cls 中所有的属性

21. class_getIvarLayout

OBJC_EXPORT const uint8_t * _Nullable
class_getIvarLayout(Class _Nullable cls)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

返回强引用的 Ivar

包括下面这种写法

{
    __strong id objc;
}
复制代码

22. class_getWeakIvarLayout

OBJC_EXPORT const uint8_t * _Nullable
class_getWeakIvarLayout(Class _Nullable cls)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

返回弱引用的 Ivar

包括下面这种写法

{
    __weak id objc;
} 

复制代码

23. class_addMethod

OBJC_EXPORT BOOL
class_addMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, 
                const char * _Nullable types) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

cls添加指定的方法和实现。该方式会替换父类中的实现,但无法替换本类中的实现。

24. class_replaceMethod

OBJC_EXPORT IMP _Nullable
class_replaceMethod(Class _Nullable cls, SEL _Nonnull name, IMP _Nonnull imp, 
                    const char * _Nullable types) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

替换方法的实现,name,要替换的方法名,imp替换后的实现,types方法参数

25. class_addIvar

class_addIvar(Class _Nullable cls, const char * _Nonnull name, size_t size, 
              uint8_t alignment, const char * _Nullable types) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

添加新的成员变量。此函数只能在 objc_allocateClassPair 之后和 objc_registerClassPair 之前调用。不支持将实例变量添加到现有类中

26. class_addProtocol

OBJC_EXPORT BOOL
class_addProtocol(Class _Nullable cls, Protocol * _Nonnull protocol) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

cls 新增协议

27. class_addProperty

OBJC_EXPORT BOOL
class_addProperty(Class _Nullable cls, const char * _Nonnull name,
                  const objc_property_attribute_t * _Nullable attributes,
                  unsigned int attributeCount)
    OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0);
复制代码

cls 新增属性

28. class_replaceProperty

OBJC_EXPORT void
class_replaceProperty(Class _Nullable cls, const char * _Nonnull name,
                      const objc_property_attribute_t * _Nullable attributes,
                      unsigned int attributeCount)
    OBJC_AVAILABLE(10.7, 4.3, 9.0, 1.0, 2.0);
复制代码

替换属性

29. class_setIvarLayout

OBJC_EXPORT void
class_setIvarLayout(Class _Nullable cls, const uint8_t * _Nullable layout)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

设置强引用Ivar

30. class_setWeakIvarLayout

OBJC_EXPORT void
class_setWeakIvarLayout(Class _Nullable cls, const uint8_t * _Nullable layout)
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0, 2.0);
复制代码

设置弱引用Ivar

31. objc_getFutureClass

不说了,注释有说明Do not call this function yourself

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享