字典轉(zhuǎn)單例Model對(duì)象的問題
今天工作中,遇到一個(gè)坑,項(xiàng)目使用YYModel進(jìn)行字典模型轉(zhuǎn)換的。先看下Demo代碼:
- 定義一個(gè)模型類:
@interface singleModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *sex;
@property (nonatomic, copy) NSString *age;
@property (nonatomic, copy) NSString *address; ```
* 這是正常使用YYmodel 字典轉(zhuǎn)模型的姿勢(shì):
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"man",@"age":@"17",@"address":@"jiangsu"};
singleModel *model = [singleModel yy_modelWithDictionary:dic];
NSLog(@"%@",model.name);
從打印結(jié)果來看是很正常的,沒問題,接下來,看下面代碼:
* 先在模型類中添加單例方法:
- (instancetype)shared{
static singleModel *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}```
在控制器中代碼如下:
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"man",@"age":@"17",@"address":@"jiangsu"};
singleModel *model = [singleModel shared];
model = [singleModel yy_modelWithDictionary:dic];
NSLog(@"%@",model.name);
NSLog(@"%@",[singleModel shared].name);
我們看下控制臺(tái)的打印結(jié)果:

singleDemo.png
,
不知道你們看到這個(gè)結(jié)果,是什么表情,反應(yīng)由于我學(xué)藝不精,我是醉了,不理解為什么,從打印結(jié)果和左面看內(nèi)存中的值,是已經(jīng)賦值成功了的,為毛,通過單例取值的時(shí)候是nil 呢???

看地址.png
通過指針,應(yīng)該可以看出端倪了,納尼,竟然不是一個(gè)地址,那應(yīng)該就明白了,為什么通過這種方式,單例對(duì)象賦值失敗了。
那有什么辦法,可以解決這個(gè)辦法呢?要是對(duì)象有十幾個(gè)屬性,我要一個(gè)一個(gè)屬性賦值么,這樣太麻煩了,我們可以通過KVC的方式來解決。
看代碼:
NSDictionary *dic = @{@"name":@"zhangsan",@"sex":@"man",@"age":@"17",@"address":@"jiangsu"};
singleModel *model = [singleModel shared];
[model setValuesForKeysWithDictionary:dic];
NSLog(@"%@",model.name);
NSLog(@"%@",[singleModel shared].name);
看結(jié)果:

singleDemo2.png
可以看到 ,這樣的指針是一樣的,通過這種方法,就可以解決這一問題了,有一點(diǎn)要注意,當(dāng)字典里里的key,我們mdel類沒有定義的時(shí)候,會(huì)崩潰,如下:

crash.png
這就是因?yàn)?字典里的key "school" 在model里沒有,這是我們只需要在模型類實(shí)現(xiàn)此方法就好了:
- (void)setValue:(id)value forUndefinedKey:(nonnull NSString *)key{
NSLog(@"%@",key);
}
string 轉(zhuǎn) Date 的總是相差8小時(shí)的問題
代碼如下:

string 轉(zhuǎn)date.png
從打印臺(tái),看到卻是是相差8小時(shí),原因是因?yàn)槟J(rèn)是GMT格林威治時(shí)間,我們轉(zhuǎn)換成UTC 世界時(shí)間 ,就好了,完整代碼如下:
NSString *timeStr = @"2016-10-28 10:16";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-HH-dd HH:mm"];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *date = [[NSDate alloc] init];
date = [formatter dateFromString:timeStr];
NSLog(@"%@",date);