@interface IdsModel : NSObject
@property (nonatomic,strong)NSString *ids;
@end
@implementation IdsModel
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSDictionary*param = @{@"ids":@123};
IdsModel *model = [IdsModel modelWithDictionary:param];
NSArray *array = [model.ids componentsSeparatedByString:@","];
NSString*str = param[@"ids"];
NSArray *array1 = [str componentsSeparatedByString:@","];
}
1.在这种情况哪个array会崩.如果你已经知道答案.并且已经看过yymodel内部实现.那么可以跳过啦.
首先会通过运行时获取你声明的对象类型. 参数类型.返回类型.偏移量等等.然后存放到YYClassInfo里面了.
里面也考虑到父类的情况.怎么判断当前类没有父类了呢.通过判断父类是否为nil. 如果父类不为nil就一直递归.直到找到父类为nil才退出递归.
这里配上这张图.正好运用了这张图原理.
无论后台给你返回的是String字符串 还是用Int
yymodel都会根据你声明的(类型)把value转换成你声明的类型.
这种做法是比较好的.之前我在项目中遇到了这样一些情况:本来服务端给的参数是一个 string 类型,经过模型转换后,赋值到一个 string 的属性中去,但后来服务端不小心改掉了,换成了 number 类型,造成后续访问那个 string 属性时,实际访问的是 number ,然后使用造成了一些崩溃。框架内部做了一些处理解决了这种问题.
几年前与别人开发中.我是使用的YYModel.然后别人使用的是MJExtension. 人家问我二个之间有什么差别.我当时也回答不出来.
以下是我自己的个人分析.如有说错.或者不同意见.可以一起探讨分析共同成长.
虽然写法不一样.但是都是通过判断父类是否为nil .来保证所有数据都能遍历到.
对比之后发现YYModel 里面运用的是比较底层的东西 比如赋值yymodel使用 objc_msgSend MJExtension 是setvalueforkey 个人觉得objc_msgSend效率会更高一点. 因为setvalueforkey有个查找属性的过程. 而objc_msgSend是直接赋值.. YYModel里面使用的代码有用到c语言和CF之类一些偏底层东西(因为效率更高的缘故牺牲可读性). MJExtension里面用到的是我们常用的NS 注释也比较全面阅读起来容易.但是效率方面还是YYModel更好一点.
最近碰到一个问题就是加密.方法需要的参数全部要求是char *类型的. 然后我突发奇想.分别测试了一下2个库能不能直接转换成char *毕竟要每个NSString自己单独转换成c字符串挺麻烦的.
@interface IdsModel : NSObject
@property (nonatomic,assign)char *ids;
@end
@implementation IdsModel
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSDictionary*param = @{@"ids":@"123"};
IdsModel *model = [IdsModel modelWithDictionary:param];
IdsModel *model1 = [IdsModel mj_objectWithKeyValues:param];
}
然后发现YYModel 对于char*类型不做处理. (为什么不做处理个人猜想.因为系统NSString帮你做好了释放工作.如果里面帮你使用malloc开辟空间之后.你还的自己用free释放比较麻烦.干脆不处理). 前面的文章讲了NSMutableString也是使用了malloc开辟空间.自己做了释放的工作free.
对于MJExtension使用了setvalueforkey导致崩溃.
参考:https://blog.ibireme.com/2015/10/23/ios_model_framework_benchmark/