前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS运行时的应用:动态添加方法、属性关联

iOS运行时的应用:动态添加方法、属性关联

作者头像
公众号iOS逆向
发布2021-07-29 16:10:56
9670
发布2021-07-29 16:10:56
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
  • 1.1 获取类名
  • 1.2 获取成员变量
  • 1.3 获取成员属性
  • 1.4 获取类的实例方法
  • 1.5 获取协议列表
  • 1.6 动态添加方法
  • 1.7 方法实现交换
  • 2.1 字典转模型KVC实现
  • 2.2 路由的实现:接口控制app跳任意界面
  • 2.3 属性关联

引言


RuntimeKit对Runtime常用的方法进行了简单的封装。主要是动态的获取类的一些属性和方法的,以及动态方法添加和方法交换。

  • object-c 的运行时API:

1、动态新增属性(objc_setAssociatedObject、objc_getAssociatedObject); 2、修改和获取属性(class_getInstanceVariable、object_setIvar、object_getIvar); 3、swizzling交换替换方法的实现(class_getInstanceMethod、class_addMethod、class_replaceMethod、method_exchangeImplementations,想要执行原来的方法就直接调用replaceMethod,因为方法的实现IMP已经被换了)

iOS运行时的应用:

1、实现路由(接口控制app跳任意界面 ) 2、获取修改对象的成员属性 3、动态添加/交换方法的实现 4、属性关联

I、基本使用

1.1 获取类名

使用class_getName(Class)就可以在运行时来获取类的名称

class_getName()函数返回的是一个char类型的指针,也就是C语言的字符串类型,所以我们要将其转换成NSString类型,然后再返回出去。http://blog.csdn.net/z929118967/article/details/77945351

代码语言:javascript
复制

/**
 获取类名
 
 @param class 相应类
 @return NSString:类名
 */
+ (NSString *)fetchClassName:(Class)class {
    const char *className = class_getName(class);
    return [NSString stringWithUTF8String:className];
}

1.2 获取成员变量

用ivar_getTypeEncoding()来获取相应成员变量的类型。

使用ivar_getName()来获取相应成员变量的名称。下方就是对获取成员变量的功能的封装。返回的是一个数组,数组的元素是一个字典,而字典中存储的就是相应成员变量的名称和类型。

代码语言:javascript
复制
/**
 获取成员变量
 
 @param class Class
 @return NSArray
 */
+ (NSArray *)fetchIvarList:(Class)class {
    unsigned int count = 0;
    Ivar *ivarList = class_copyIvarList(class, &count);
    
    NSMutableArray *mutableList = [NSMutableArray arrayWithCapacity:count];
    for (unsigned int i = 0; i < count; i++ ) {
        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:2];
        const char *ivarName = ivar_getName(ivarList[i]);
        const char *ivarType = ivar_getTypeEncoding(ivarList[i]);
        dic[@"type"] = [NSString stringWithUTF8String: ivarType];
        dic[@"ivarName"] = [NSString stringWithUTF8String: ivarName];
        
        [mutableList addObject:dic];
    }
    free(ivarList);
    return [NSArray arrayWithArray:mutableList];
}

在OC中的给类添加成员属性其实就是添加了一个成员变量和getter以及setter方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • I、基本使用
    • 1.1 获取类名
      • 1.2 获取成员变量
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档