菜鸟程序猿的爬坑日记(一)

1.NSDictionary初始化

  乱入有关通知NSNotification(有点扯淡):很少用通知,今天随手写了个通知传值,死活传不过去,打断点找了半天也没发现,最后是朋友发现了,发送和接收的通知名写的不一致。。。我也是醉,以后还是习惯性地把通知名抽成宏吧!!

  后来还发现一个问题:当时我在项目中的需求是点击A控制器的cell创建并push跳转到B控制器再跳转到C,而在C中我需要拿到A中所选Cell的模型中的一个属性值id来作为C中数据请求的一个参数,总之我就是要从A到C进行值传递,于是我就试着采用了通知,结果发现在A push B 之前 发送通知,在C中注册监听,但结果发现监听通知的方法并没有执行。那这里我个人初步认定是 因为通知发送出去的时候C还没有实例化,也就还没有注册监听接收到通知,当然了由于我是自学,加之通知基本没怎么用过,而且自己学习的时候值传递一般都是A到B,或者B到A,这种情况还是第一次,所以权威原因尚不敢肯定(日后求证了来记一笔。。)不过我认为八九不离十,可以在A中创建子线程,常驻,在while循环中不断发送通知,这样就应该能接收到了。-_-!我最后还是采用在B和C中设置属性来接收,从A传到B再传到C,轻松搞定!(其实当初也是犯贱要尝试用不熟练的传值方式,目前了解的传值:1.属性接收、2.代理delegate、3.block、4.通知NSNotification、5.NSUserDefault、6单例等)。。。。

Objective-C中,NSDictionary初始化的方法有很多种

方法1: [NSDictionary dictionaryWithObjectsAndKeys:<#(id), ...#>, nil]

方法2: NSDictionary *dic = @{@"key":value}

坑在哪里?

坑就在第二种初始化方法 NSDictionary *dic = @{@"key":value}

它到底是如何坑的呢?

如果你的value是为nil 必将引发崩溃:

'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]

意思就是说使用[__NSPlaceholderDictionary initWithObjects:forKeys:count:]这个初始化方法,发现keys count和objcects的个数不匹配了

如何规避?

在使用@{@”key”:value} 这种方式初始化的时候,一定要对value做是否为nil的判断,为nil就不要加入Dictionary

使用标准的初始化方法:

NSDictionary dictionaryWithObjectsAndKeys:value1,@"v1",value2,@"v2",value3,@"v3", nil];

或其它的几个初始化方法进行初始化,这样如果value为nil就不会加入字典,使用 objectForKey:取出来的对象就会为nil对象,不会引发崩溃。

关联:

使用@[]方法初始化NSArray也有此坑,规避方法同字典一样

2.字典转模型

之前写吐了的代码,用了MJExtension之后好久没写了。。

+ (instancetype)shopWithDict:(NSDictionary *)dict
{
DLShop *shop = [[self alloc] init];
[shop setValuesForKeysWithDictionary:dict];
 return shop;
}

或者

-(instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dict];
}
return self;
}
+ (instancetype)shopWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}

在模型的.h文件里面提供属性接口和这两个实例化方法,在.m文件里实现他们

- (void)setValuesForKeysWithDictionary:(NSDictionary<NSString *, id> *)keyedValues;

上面方法的头文件: Given a dictionary containing keyed attribute values, to-one-related objects, and/or collections of to-many-related objects, set the keyed values. Dictionary entries whose values are NSNull result in -setValue:nil forKey:key messages being sent to the receiver.(有关NSNull)
 今天遇到的坑,

   崩在这里了,太年轻,找了半天,浪费不少时间,最终发现是模型的属性少写了一个,如上图,字典里面有八个键值对,模型属性只有5个。(至于为什么会发生如下的无线调用导致内存崩溃,尚不得知-_-!)总之在这里模型属性只能多不能少!模型属性只能多不能少!模型属性只能多不能少!重要的事情要说三遍

你可能感兴趣的:(菜鸟程序猿的爬坑日记(一))