第02天实战技术(01):runtime回顾
2017-03-25 00:00
393 查看
消息机制
2.交换方法
3.动态添加方法
4.动态添加属性
5.自动生成属性代码
6.字典转模型KVC实现
任何方法调用本质 : 发送一个消息,用runtime发送消息,OC底层实现通过runtime实现 >>> OC id objc = [NSObject alloc]; // 分配内存 objc = [objc init]; // 初始化 >>> runtime id objc = objc_msgSend([NSObject class], @selector(alloc)); objc = objc_msgSend(objc, @selector(init));
2.交换方法
修改系统的方法 是用交换方法 Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:)); Method lyh_imageNamedMethod = class_getClassMethod(self, @selector(lyh_imageNamed:)); method_exchangeImplementations(imageNamedMethod, lyh_imageNamedMethod);
3.动态添加方法
Person *p = [[Person alloc]init]; [p performSelector:@selector(run:) withObject:@15]; >>> // 解决类方法 // + (BOOL)resolveClassMethod:(SEL)sel // 解决类方法 + (BOOL)resolveInstanceMethod:(SEL)sel >>> 在方法里面进行执行(有没有这个方法) + (BOOL)resolveInstanceMethod:(SEL)sel { if (sel == NSSelectorFromString(@"run:")) { class_addMethod(self, sel, (IMP)test, "v@:"); return YES; // 表示处理完毕 不会进来这里了 } return [super resolveInstanceMethod:sel]; } >>> runtime动态添加方法的函数 #pragma mark 函数的实现 #pragma 1.没有参数的方法 // 函数 // 没有返回值,也没有参数 // void,(id,SEL) void aaa(id self , SEL _cmd) { NSLog(@"吃东西"); } #pragma 2.带参数的方法 void test(id self , SEL _cmd, NSNumber *meter) { NSLog(@"跑了%@公里",meter); }
4.动态添加属性
给系统添加属性 比如给NSObject 添加一个name属性 >>> code // set方法 - (void)setName:(NSString *)name { // 设值 objc_setAssociatedObject(self, @"name", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } // get方法 - (NSString *)name { // 取值 return objc_getAssociatedObject(self, @"name"); }
5.自动生成属性代码
6.字典转模型KVC实现
比如模型 需要定义很多个属性,这时候 我们可以使用runtime去实现 >>> code #import "NSDictionary+Property.h" @implementation NSDictionary (Property) - (void)createPropertyCode { NSMutableString *codes = [NSMutableString string]; // 1.遍历字典 // enumerateKeysAndObjectsUsingBlock 遍历字典 [self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { NSString *code; if ([obj isKindOfClass:[NSString class]]) { code = [NSString stringWithFormat:@"@property(nonatomic, strong) NSString * %@;",key]; } else if ([obj isKindOfClass:NSClassFromString(@"__NSCFBoolean")]) { code = [NSString stringWithFormat:@"@property(nonatomic, assign) BOOL %@;",key]; } else if ([obj isKindOfClass:[NSNumber class]]) { code = [NSString stringWithFormat:@"@property(nonatomic, assign) NSInteger %@;",key]; } else if ([obj isKindOfClass:[NSArray class]]) { code = [NSString stringWithFormat:@"@property(nonatomic, strong) NSArray * %@;",key]; } else if ([obj isKindOfClass:[NSDictionary class]]) { code = [NSString stringWithFormat:@"@property(nonatomic, strong) NSDictionary * %@;",key]; } [codes appendFormat:@"\n%@\n",code]; }]; NSLog(@"-- %@",codes); } @end
相关文章推荐
- 第02天实战技术(03):Runtime(字典转模型,一级转换)
- 第02天实战技术(04):runtime字典转模型
- 最纯粹的直播技术实战01-FFmpeg的编译与运行
- 第01天实战技术(08):Runtime(消息机制调用多个参数)
- 第02天实战技术(11):static和const联合使用
- 第03天实战技术(01):网易新闻(搭建界面)
- 第02天实战技术(07):const与宏的区别
- 【张孝祥并发课程笔记】01:传统线程技术和定时器技术回顾
- TensorFlow 技术解析与实战 笔记 01
- 第02天实战技术(13):父子控制器(简介)
- 第02天实战技术(14):父子控制器(完善)
- 第04天实战技术(01):block开发使用场景(保存代码)
- 第01天实战技术(07):Runtime(消息机制)
- 第02天实战技术(05):super,superClass,class
- 第02天实战技术(12):extern和const联合使用
- 第01天实战技术(11):Runtime(交换方法)
- 第01天实战技术(10):Runtime(交换方法自定义UIImage)
- 第02天实战技术(06):项目恶心Bug
- 第02天实战技术(02):KVC字典转模型
- 第02天实战技术(09):开发中const使用场景