看看别人都在用runtime做什么?
实例001:iOS中利用 runtime 一键改变字体
知识点:
- 利用
Method Swizzling
技术修改willMoveToSuperview:
的实现,利用tag
属性和isKindOfClass:
之类的探测方法可以做一些精细的控制。 - 在一个程序(
main函数
)运行之前,所用到的库被加载到runtime之后,系统自动完成所有注册到运行时系统的类的+load方法调用,而且确保父类的调用一定在子类之前,所以子类+load中没必要显式调用[super load];
实例002:Objective-C Runtime之着魔的UIAlertView
知识点:
- 使用Category和Associated Objects为UIAlertView关联一个
void (^)(UIAlertView *, NSUInteger)
类型的block,并在设置block的同时将delegate
设置为self。 - 如果是开发iOS8+的应用,推荐使用UIAlertAction+UIAlertController
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"title" message:@"message" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleCancel handler:nil];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"ok" style:UIAlertActionStyleDefault
handler:^(UIAlertAction *alertAction){
NSLog(@"如果你是iOS8以上的应用,这个适合你,简单明了");
}];
[alertController addAction:cancelAction];
[alertController addAction:okAction];
[self presentViewController:alertController animated:YES completion:nil];
实例003:为iPad设备加载正确的nib文件
知识点:
- 利用
Method Swizzling
技术修改loadNibNamed:owner:options:
的实现,通过检查"@pad"后缀的文件是否存在决定加载哪个nib文件
实例004:自动实现NSCoding、NSCopying协议的对象
实例005:Json字典和Model对象的相互转换
参考:源码篇:Mantle
知识点:
- KVC
- NSValueTransform
- NSInvocation
- runtime中操作对象和类的属性的函数
实例006:iOS 万能跳转界面方法 (runtime实用篇一)
思路:将需要跳转的ViewController的类名、以及需要传递的参数封装起来,剩下的就是根据类名动态创建对象,然后根据参数字典给属性/成员变量赋值;OK,VC实例组装完了是push还是present好好考虑把。
实例007:JSPatch – 动态更新iOS APP,实时修复线上版本的bug
知识点:
- 持续关注作者bang的博客
- 基本原理:JS 传递字符串给 OC,OC 通过 Runtime 接口调用和替换 OC 方法。详细参考:JSPatch 实现原理详解
- 使用 JSPatch的代码补全插件,并了解其实现原理
- 使用 JSPatchConvertor 工具将OC源码自动转换成JS代码