来源:ian(@ianisme)
链接:http://www.ianisme.com/ios/2019.html
本片包括运用runtime机制实现对类的持久化,类的数据转化,以及动态给类增加方法等内容。更多内容可以参考前两篇的基础内容。
类的归档篇
苍老师的资料总要整理一下吧!
创建People.h
12345678910 #import <Foundation/Foundation.h>@interface People : NSObject <NSCoding>@property (nonatomic, copy) NSString *name; // 姓名@property (nonatomic, strong) NSNumber *age; // 年龄@property (nonatomic, copy) NSString *occupation; // 职业@property (nonatomic, copy) NSString *nationality; // 国籍@end
People.m
类的转换篇
服务器返回了大量苍老师的数据,手机端这边接收后如何去转换呢?当然是要将JSON转换为Model啦!
相信平时你们的项目中也用到过这些三方库,下面我们去了解下runtime实现JSON和Model互转。
创建People.h
12345678910111213141516 #import <Foundation/Foundation.h>@interface People : NSObject@property (nonatomic, copy) NSString *name; // 姓名@property (nonatomic, strong) NSNumber *age; // 年龄@property (nonatomic, copy) NSString *occupation; // 职业@property (nonatomic, copy) NSString *nationality; // 国籍// 生成model- (instancetype)initWithDictionary:(NSDictionary *)dictionary;// 转换成字典- (NSDictionary *)covertToDictionary;@end
People.m的代码如下:
main.m中运行以下代码:
最后输出内容如下:
相信通过前面的学习,这些代码不用写过多的注释你也可以看懂了,我把假设是网络返回的苍老师的资料转化为了model,然后又将model转回字典。这是一个JSON转Model相互转换的一个思路,大家稍后运行Demo细细品味。
动态增加类的方法篇
这个实例主要是验证一下上文《5.2 消息动态解析》
第一首:
添加sing实例方法,但是不提供方法的实现。验证当找不到方法的实现时,动态添加方法。
创建People.h
创建People.m
在main.m中运行以下代码:
结果如下:
我们没有提供苍老师唱歌的方法实现,因此在调用此方法的时候,会调用resolveInstanceMethod方法,我们动态添加了方法。我们也可以返回No,继续向下传递。(此处请返回《5.2 消息动态解析》第一步品味下)
第二首
外面的小鸟在唱歌,但是苍老师的歌声盖过了小鸟,我们只能听到苍老师唱歌了。
这里我们不声明sing方法,将调用途中动态更换调用对象。
在第一首代码的基础上,创建Bird的model
Bird.h
Bird.m
main.m运行代码如下:
运行结果如下:
成功更换了对象,把对象更换为苍老师了。(此处请返回《5.2 消息动态解析》品味)
第三首
苍老师不想唱歌想跳舞了。
这里我是实现不提供声明,不修改调用对象,但是将sing方法修改为dance方法。
创建People.h
People.m
在main.m中运行如下代码:
结果如图:
成功更换了方法,苍老师由唱歌改为跳舞了(此处请返回《5.2 消息动态解析》品味)
总结
好吧,我承认我骗了你,当你读到这里你肯定花了不止1小时。都是我的错,不是因为你笨,之所以说1小时是为了让你有信心,有耐心继续下去。读到这里恭喜你已经在iOS开发的道路上又向前了一步!同时我也要感谢以下参考文献以及文章,是他们让我更好的理解了runtime,再次表示感谢!这篇文章断断续续写了将近一周的时间,您可以读到这里就是对我最大的鼓励,谢谢!