| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> ios Runtime的几种常见用途 -> 正文阅读 |
|
[移动开发]ios Runtime的几种常见用途 |
1. 动态的交换(类方法)- (void)viewDidLoad { ?[super viewDidLoad]; ?[SecMainViewController run]; ?[SecMainViewController jump]; ????//这打印的是跑和跳? ? ? MethodnewRun ????=class_getClassMethod([SecMainViewControllerclass],@selector(run)); ? ? MethodnewJump ????=class_getClassMethod([SecMainViewControllerclass],@selector(jump)); ? ? method_exchangeImplementations(newRun, newJump); ? ? [SecMainViewController run]; ? ? [SecMainViewController jump]; ????? //交换之后 打印的是跳 和 跑 } +(void)run { ? ? NSLog(@"跑"); } +(void)jump { ? ? NSLog(@"跳"); } 2.拦截系统方法(以动态适配屏幕字体和大小为例子)步骤: 1、为UIFont建一个分类(UIFont+Category) 2、分类中重写UIFont的load方法,实现方法的交换(只要能让其执行一次方法交换语句,load再合适不过了) ? ? // 获取替换后的类方法 ? ? Method newMethod ????=class_getClassMethod([self class],@selector(adjustFontName:size:)); ? ? // 获取替换前的类方法 ? ? Method method =class_getClassMethod([self class],@selector(fontWithName:size:)); ? ? // 然后交换类方法,交换两个方法的IMP指针,(IMP代表了方法的具体的实现) ? ? method_exchangeImplementations(newMethod, method); ????} 3.实行自定义的adjustFontName:size方法+ (UIFont*)adjustFontName:(NSString*)name size:(CGFloat)fontSize{ ? ? UIFont*newFont =nil; ? ? newFont = [UIFontadjustFontName:namesize:fontSize * ????[UIScreenmainScreen].bounds.size.width/MyUIScreen]; ? ? return newFont; } 注意:自定义方法中最后一定要再调用一下系统的方法,让其有设置font的功能,但是由于方法交换,系统的方法名已经变成了我们自定义的方法名(有点绕,就是用我们的名字能调用系统的方法,用系统的名字能调用我们的方法),这就实现了系统方法的拦截! 3.在分类中设置属性,给任何一个对象设置属性步骤: 1、创建一个分类,比如给任何一个对象都添加一个name属性,就是NSObject添加分类(NSObject+Category) 2、先在.h 中@property 声明出get 和 set 方法,方便点语法调用 @property(nonatomic,copy)NSString*name; 3、在.m 中重写set 和 get 方法,内部利用runtime 给属性赋值和取值 char nameKey; - (void)setName:(NSString*)name { // 将某个值跟某个对象关联起来,将某个值存储到某个对象中 objc_setAssociatedObject(self, &nameKey, name,OBJC_ASSOCIATION_COPY_NONATOMIC); } - (NSString*)name { return objc_getAssociatedObject(self,&nameKey) } 4.实现字典和模型的自动转换(核心就是可以遍历出字典中的每个属性,json解析中大牛框架都用了这个特性,包括MJEXtension,YYModel,jsonModel都是将json转换为字典,再遍历字典中的每个属性来进行modle的转换)? 5.实现万能控制器跳转产品来一变态需求,推送过来的消息,要跳转到任意控制器.利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了 6.Jspath 热更新?使用运行时,jspatch 基本上算是黑科技,在线修复版本bug,微信都使用了这个技术,详情百度“JSPatch”,此处省略30000字 总结了几种常见runtime使用,希望对大家有帮助 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:17:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |