美文网首页
OC 运行时 记录

OC 运行时 记录

作者: 米修斯_ | 来源:发表于2016-10-19 21:33 被阅读42次
    typedef struct objc_method *Method; // Method 的定义
     
    typedef struct objc_ivar *Ivar; // Ivar 的定义  参数
     
    typedef struct objc_category *Category // 这个类有哪些category
     
    typedef struct objc_property *objc_property_t; // 属性的定义
    
    struct objc_class {
        Class isa 
        Class super_class 
       long version
       long info 
       long instance_size 
      struct objc_ivar_list *ivars    // 实例参数链表 
       struct objc_method_list **methodLists  // 方法的列表
        struct objc_protocol_list *protocols // 协议的列表
    }
     // 定义方法的描述
    struct objc_method_description {
      SEL name ; // 方法的名称
     char *types; // 方法的参数
    }
    // 属性结构的定义
    typedef struct {
         const char *name ; // 属性的名称
         const char *value ; // 属性的值 
    }objc_property_attribute_t;
    
    Class object_getClass(id obj) // 返回对象的Class 
    Class object_setClass(id obj,Class cls) // 修改obj 的Class 
    Bool object_isClass(id obj) ;
    const char *object_getClassName(id obj); // 返回obj 的Class 名称;
    id object_getIvar(id obj,Ivar ivar);//读取对象参数的值  速度比object_getInstanceVariable快
    void object_setIvar(id obj ,Ivar ivar ,id value )// 设置对象参数的值  速度比object_setInstanceVariable 快 
    但是object_setInstanceVariable 不能再ARC 下使用
    
    /**  获得Class的定义    **/
    Class objc_getClass(const char* name ) ; 
    Class objc_getMetaClass(const char* name ) ;  // 得到元类
    Class objc_lookUpClass(const char *name) // 
    class_setVersion(Class cls, int version)
    int class_getVersion(Class cls) 
    size_t class_getInstanceSize(Class cls) 初始化时需要 的内存大小 
    Ivar class_getInstanceVariable(Class cls, const char *name)//获取类中指定名称实例成员变量的信息
    Ivar class_getClassVariable(Class cls ,const char *name) / 获取类成员变量的信息 目前 oc 不支持类成员变量 
    Ivar *class_copyIvarList(Class cls, unsigned int *outCount)  // 获取所有的实例变量信息
    Method class_getInstanceMethod(Class cls, SEL name) //获取实例方法    包含搜索 父类  
     Method class_getClassMethod(Class cls,SEL name) // 获取类的方法  包含搜索 父类  ,如果父类没有此方法,会返回nil
    IMP class_getMethodImplementation(Class cls, SEL name) // 返回方法的指针
    IMP class_getMethodImplementation_stret(Class cls, SEL name)  // 返回方法的指针 
    BOOL class_respondsToSelector(Class cls, SEL sel)  //  类实例是否有 某个方法 
    Method *class_copyMethodList(Class cls, unsigned int *outCount)  // 获取类的所有方法 ,不包含父类方法
    BOOL class_conformsToProtocol(Class cls, Protocol *protocol) 
     
     Protocol * __unsafe_unretained *class_copyProtocolList(Class cls, unsigned int *outCount) // 获取所有的 协议  free()  不包含 父类 
    objc_property_t class_getProperty(Class cls, const char *name) // 得到类的某个属性 
    objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) // 属性列表  不包含父类
    BOOL class_addMethod(Class cls, SEL name, IMP imp, 
                                     const char *types)  // 动态添加方法  ,如果原先有这个方法,将会返回NO ,表示添加不成功,想覆盖用method_setImplemention
    
    IMP class_replaceMethod(Class cls, SEL name, IMP imp, 
                                        const char *types)  // 如果想要替换的方法不存在 则会 执行add_method ,如果存在 则 method_setImplemention 
     
    BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types)  添加变量 只能用在 after objc_allocateClassPair and before objc_registerClassPair. 
    BOOL class_addProtocol(Class cls, Protocol *protocol) 、、 添加存在的 ,返回NO 
    BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount) 、、 添加存在的返回NO attributes 描述 引用类型,参数类型,
    class_replaceProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
     Class objc_allocateClassPair(Class superclass, const char *name,  size_t extraBytes) // 动态创建类  extraBytes  传0 即可
    void objc_registerClassPair(Class cls)   // 注册类
    
    SEL method_getName(Method m)  // 获取方法的名称
     
    IMP method_getImplementation(Method m) // 获取方法的指针
     
    const char *method_getTypeEncoding(Method m)  // 返回方法的返回值,和参数
    
    unsigned int method_getNumberOfArguments(Method m) // 返回方法的参数个数
    
     
    char *method_copyReturnType(Method m)  、、返回方法的返回值。 free() 释放 
     
     char *method_copyArgumentType(Method m, unsigned int index)  、、返回第几个参数 free() 
     
    void method_getReturnType(Method m, char *dst, size_t dst_len)  
     
    void method_getArgumentType(Method m, unsigned int index, char *dst, size_t dst_len) 
    
    struct objc_method_description  *method_getDescription(Method m) 
    
    IMP method_setImplementation(Method m, IMP imp)  、、 方法的实现 
    
     
    void method_exchangeImplementations(Method m1, Method m2)   // 交换 
    
    const char *ivar_getName(Ivar v) 
    const char *ivar_getTypeEncoding(Ivar v) 
    const char *property_getName(objc_property_t property)
    const char *property_getAttributes(objc_property_t property) 
    objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount)
     
    char *property_copyAttributeValue(objc_property_t property, const char *attributeName)
     
    Protocol *objc_getProtocol(const char *name)
    
    Protocol * __unsafe_unretained *objc_copyProtocolList(unsigned int *outCount)
    
    BOOL protocol_conformsToProtocol(Protocol *proto, Protocol *other)
     
    BOOL protocol_isEqual(Protocol *proto, Protocol *other)
    
    const char *protocol_getName(Protocol *p)
    
    struct objc_method_description protocol_getMethodDescription(Protocol *p, SEL aSel, BOOL isRequiredMethod, BOOL isInstanceMethod) 、、 协议的 类型 和名称 
     
    
    struct objc_method_description *protocol_copyMethodDescriptionList(Protocol *p, BOOL isRequiredMethod, BOOL isInstanceMethod, unsigned int *outCount)
    
    
    objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty)
    
    objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)
    
     
    
    Protocol * __unsafe_unretained *protocol_copyProtocolList(Protocol *proto, unsigned int *outCount)
    
     Protocol *objc_allocateProtocol(const char *name) 
     
    void objc_registerProtocol(Protocol *proto) 
    
    void protocol_addMethodDescription(Protocol *proto, SEL name, const char *types, BOOL isRequiredMethod, BOOL isInstanceMethod) 
    
     
    void protocol_addProtocol(Protocol *proto, Protocol *addition) 
    
    void protocol_addProperty(Protocol *proto, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount, BOOL isRequiredProperty, BOOL isInstanceProperty)
    
     
    
    const char *sel_getName(SEL sel)  、、
     
    // category 添加属性 用到
     void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    id objc_getAssociatedObject(id object, const void *key) 
    void objc_removeAssociatedObjects(id object)
    
    
    
    
    

    相关文章

      网友评论

          本文标题:OC 运行时 记录

          本文链接:https://www.haomeiwen.com/subject/sxtnjttx.html