复现crash场景选取破损图点击选取按钮crash,控制台输出:
*** setObjectForKey: object cannot be nil (key: croppedImage)
代理方法:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullableNSDictionary<NSString *,id> *)editingInfo;
都没有调用。
通过控制台输出日志可以看出系统在字典中加入nil引起了crash了
解决方案:
使用runtime修改NSMutableDictionary的setObject:forKey:方法
- (void)na_setObject:(id)anObject forKey:(id<NSCopying>)aKey {
if (!anObject){
TLog(@"%s can add nil object into NSMutableDictionary",__FUNCTION__);
return;
}
[selfna_setObject:anObjectforKey:aKey];
}
这样可以避免crash但是UIImagePickerController不会执行:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullableNSDictionary<NSString *,id> *)editingInfo;
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
获取破损图的方法:使用记事本打开任意图片,删除其中一段保存。