ios开发 Reflection(三) 利用反射自动绑值

反射的具体应用,自动绑值

获取属性列表

 1 - (NSArray*)propertyKeys
 2 {
 3     unsigned int outCount, i;
 4     objc_property_t *properties = class_copyPropertyList([self class], &outCount);
 5     NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount];
 6     for (i = 0; i < outCount; i++) {
 7         objc_property_t property = properties[i];
 8         NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
 9         [keys addObject:propertyName];
10     }
11     free(properties);
12     return keys;
13 }

字典与属性列表形成映射

 1 - (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource
 2 {
 3     BOOL ret = NO;
 4     for (NSString *key in [self propertyKeys]) {
 5         if ([dataSource isKindOfClass:[NSDictionary class]]) {
 6             ret = ([dataSource valueForKey:key]==nil)?NO:YES;
 7         }
 8         else
 9         {
10             ret = [dataSource respondsToSelector:NSSelectorFromString(key)];
11         }
12         if (ret) {
13             id propertyValue = [dataSource valueForKey:key];
14             //该值不为NSNULL,并且也不为nil
15             if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) {
16                 [self setValue:propertyValue forKey:key];
17             }
18         }
19     }
20     return ret;
21 }

下面是BookModel类的自动绑值的实现

 1 #import <Foundation/Foundation.h>
 2 @interface BookModel : NSObject
 3 {
 4     NSString* _iconUrl;
 5     NSString* _bookName;
 6     NSString* _publisher;
 7     NSString* _price;
 8     NSString* _autherName;
 9     NSString* _pubdate;
10     NSString* _translator;
11     NSString* _introUrl;
12     NSInteger _numRatings;
13     CGFloat _rating;
14 }
15 @property(retain, nonatomic)NSString* iconUrl;
16 @property(retain, nonatomic)NSString* pubdate;
17 @property(retain, nonatomic)NSString* introUrl;
18 @property(retain, nonatomic)NSString* autherName;
19 @property(retain, nonatomic)NSString* translator;;
20 @property(retain, nonatomic)NSString* bookName;
21 @property(retain, nonatomic)NSString* publisher;
22 @property(retain, nonatomic)NSString* price;
23 @property(assign, nonatomic)NSInteger numRatings;
24 @property(assign, nonatomic)CGFloat rating;
25
26 - (NSArray*)propertyKeys;
27
28 - (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource;
29
30 @end
 1 #import "BookModel.h"
 2 #import <objc/runtime.h>
 3
 4 @implementation BookModel
 5 @synthesize bookName = _bookName;
 6 @synthesize iconUrl = _iconUrl;
 7 @synthesize publisher = _publisher;
 8 @synthesize price = _price;
 9 @synthesize numRatings = _numRatings;
10 @synthesize rating = _rating;
11 @synthesize autherName = _autherName;
12 @synthesize pubdate = _pubdate;
13 @synthesize translator = _translator;
14 @synthesize introUrl = _introUrl;
15
16 - (id)init
17 {
18     self = [super init];
19     if (self) {
20         // Initialization code here.
21     }
22
23     return self;
24 }
25
26 - (NSArray*)propertyKeys
27 {
28     unsigned int outCount, i;
29     objc_property_t *properties = class_copyPropertyList([self class], &outCount);
30     NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount];
31     for (i = 0; i < outCount; i++) {
32         objc_property_t property = properties[i];
33         NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
34         [keys addObject:propertyName];
35     }
36     free(properties);
37     return keys;
38 }
39
40 - (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource
41 {
42     BOOL ret = NO;
43     for (NSString *key in [self propertyKeys]) {
44         if ([dataSource isKindOfClass:[NSDictionary class]]) {
45             ret = ([dataSource valueForKey:key]==nil)?NO:YES;
46         }
47         else
48         {
49             ret = [dataSource respondsToSelector:NSSelectorFromString(key)];
50         }
51         if (ret) {
52             id propertyValue = [dataSource valueForKey:key];
53             //该值不为NSNULL,并且也不为nil
54             if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) {
55                 [self setValue:propertyValue forKey:key];
56             }
57         }
58     }
59     return ret;
60 }
61
62
63 @end
 1 #import "ViewController.h"
 2 #import "BookModel.h"
 3
 4
 5 @interface ViewController ()
 6
 7 @end
 8
 9 @implementation ViewController
10
11 - (void)viewDidLoad
12 {
13     [super viewDidLoad];
14     // Do any additional setup after loading the view, typically from a nib.
15     NSMutableDictionary *curDic=[[NSMutableDictionary alloc]init];
16     [curDic setValue:@"iconUrlffwf" forKey:@"iconUrl"];
17     [curDic setValue:@"pubdatefewfewf" forKey:@"pubdate"];
18     [curDic setValue:@"introUrlfefewf" forKey:@"introUrl"];
19     [curDic setValue:@"autherName" forKey:@"autherNamefwfwfw"];
20     [curDic setValue:@"translatorfwfewf" forKey:@"translator"];
21     [curDic setValue:@"bookNamefvvvv" forKey:@"bookName"];
22     [curDic setValue:@"publisherfwfewf" forKey:@"publisher"];
23     [curDic setValue:@"pricefwfwf" forKey:@"price"];
24     [curDic setValue:@"numRatingsssss" forKey:@"numRatings"];
25     [curDic setValue:@"ratinggggggg" forKey:@"rating"];
26
27     BookModel *bModel=[[BookModel alloc]init];
28     [bModel reflectDataFromOtherObject:curDic];
29     NSLog(@"bModel:%@",bModel.translator);
30
31 }
32
33 - (void)didReceiveMemoryWarning
34 {
35     [super didReceiveMemoryWarning];
36     // Dispose of any resources that can be recreated.
37 }
38
39 @end
时间: 2024-10-01 13:46:10

ios开发 Reflection(三) 利用反射自动绑值的相关文章

从零开始学ios开发(三):第一个有交互的app

感谢大家的关注,也给我一份动力,让我继续前进.有了自己的家庭有了孩子,过着上有老下有小的生活,能够挤出点时间学习真的很难,每天弄好孩子睡觉已经是晚上10点左右了,然后再弄自己的事情,一转眼很快就到12点了,就要去睡了,现在身体汤不牢啊,如果不早点睡,第二天上班肯定没精神,要靠红牛了,呵呵,在这样的情况下再挤出时间学习ios真的很困难,只能是见缝插针,抓紧一切可用的时间学习,时间,挤一挤总归是有的,只是多少问题. 这几天看来书的第三章,主要讲了如何添加按钮,然后为按钮添加响应事件,当点击按钮后,触

IOS开发语言Swift入门连载---自动引用计数

IOS开发语言Swift入门连载-自动引用计数 Swift使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意 引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类

文顶顶 iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

iOS开发UI篇—iOS开发中三种简单的动画设置

iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所

iOS开发中三种简单的动画设置

iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView beginAnimations:nil context:nil]; //设置动画时长 [UIView setAnimationDuration:2.0]; self.headImageView.bounds = rect; // commitAnimations,将beginAnimation之后的所有动画提交并生成动

【iOS开发-26】利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值

实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个值传递给B类中得某个值(所以需要在B类中先准备一个变量来接受,就是用@property和@synthesize整个变量即可). (2)反向传值:比如需要把B类中的值传递给A类用.我们先在B类中写一个协议,协议里面有一个可以带参数的方法,这个参数就是我们要传递的值(这个协议也可以单独写,不一定写在B类中),然后B类遵循这个协议后,利用这个协议创建一个委托变

【iOS开发-50】利用创建新的类实现代码封装,从而不知不觉实践一个简单的MVC实验

接上次案例谈代码封装.上次案例见:[iOS开发-48]九宫格布局案例:自动布局.字典转模型运用.id和instancetype区别.xib重复视图运用及与nib关系 代码封装的原则是:要保证视图控制器尽量少的接触到其他对象的属性,也就是说,尽量把数据或者属性封装到一个类里面,然后利用类或者对象的方法来调用或者设置数据.而是赤裸裸地把属性都写在视图控制器中.核心作用在于:减少视图控制器的代码量,把数据和属性的处理封装起来,这样也便于其他视图控制器的使用. 要做到的结果就是如下(我们要根据数组里面的

反射学习(三)--------利用反射调用方法

利用反射调用方法 C1 newC1Instance = new C1(); var funM = newC1Instance.GetType().GetMethod("fun", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); object[] para = { }; if (funM == null) { Console.Write("error, fu

iOS开发进阶 - 使用shell脚本自动打包上传到fir.im上-b

用fir.im测试已经好长时间了,感觉每次打包上传都很麻烦,想着是不是可以用脚本自动打包,在网上搜了一下确实有,下面总结一下如何使用脚本自动打包上传到fir.im,以及打包过程中遇到的问题和解决办法 相关资料和下载 首先是打包脚本的下载地址,这个是我找到的比较全的一个,里面有很多不同功能的shell脚本,亲测好用,传送门:https://github.com/heyuan110/BashShell?spm=5176.100239.blogcont5028.4.kFcLtR 还有关于fir指令的一