rurntime常用函数

一、在objc/message.h中常用的运行时函数

        #import <objc/message.h>

        /**
           *1.对象调用方法
        */
        id objc_msgSend(id self, SEL op, ...)

        id self://调用方法的对象
        SEL://调用的方法
        ...://方法的参数

        //示例:(在某的下拉刷新中有用到)
        Person p = [[Person alloc] init];
        [p setAge:20];
        objc_msgSend(p, self.@selector(setAge:), 20);//等价于上句

二、在objc/runtime.h中常用的运行时函数
        #import <objc/runtime.h>
        /**
        *2.获取成员变量
        */
        //获取成员变量的指针数组和个数
        Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
        Class cls:类名
        unsigned int *outCount:传入整形的地址

        //获取成员变量名
        const char *ivar_getName(Ivar v)
        //获取成员类型
        const char *ivar_getTypeEncoding(Ivar v)

        //示例:(在字典转模型的第三方框架中就是用这个函数实现的)
        // Ivar : 成员变量
        unsigned int count = 0;
        // 获得所有的成员变量
        Ivar *ivars = class_copyIvarList([HMPerson class], &count);
        for (int i = 0; i<count; i++) {
         // 取得i位置的成员变量
             Ivar ivar = ivars[i];
             const char *name = ivar_getName(ivar);
             const char *type = ivar_getTypeEncoding(ivar);
             NSLog(@"%d %s %s", i, name, type);
          }

         /**
          *3.为成员变量赋值
         */
         //为私有成员变量赋值
         - (void)willChangeValueForKey:(NSString *)key;
         void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
         - (void)didChangeValueForKey:(NSString *)key;

         //获取私有成员变量
         id objc_getAssociatedObject(id object, const void *key)

         //示例:(在某下拉刷新第三方框架中利用这个函数为UIScrollView动态的添加了HeaderView和FooterView)
         static char MJRefreshHeaderViewKey;
         static char MJRefreshFooterViewKey;

         - (void)setHeader:(MJRefreshHeaderView *)header {
             [self willChangeValueForKey:@"MJRefreshHeaderViewKey"];
             objc_setAssociatedObject(self, &MJRefreshHeaderViewKey,
                             header,
                             OBJC_ASSOCIATION_ASSIGN);
              [self didChangeValueForKey:@"MJRefreshHeaderViewKey"];
          }

         - (MJRefreshHeaderView *)header {
            return objc_getAssociatedObject(self, &MJRefreshHeaderViewKey);
         }

        - (void)setFooter:(MJRefreshFooterView *)footer {
            [self willChangeValueForKey:@"MJRefreshFooterViewKey"];
            objc_setAssociatedObject(self, &MJRefreshFooterViewKey,
                             footer,
                             OBJC_ASSOCIATION_ASSIGN);
             [self didChangeValueForKey:@"MJRefreshFooterViewKey"];
         }

        - (MJRefreshFooterView *)footer {
           return objc_getAssociatedObject(self, &MJRefreshFooterViewKey);
        }

      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值