【ios】NSMutableArray initWithContentOfFile 得到nil后无法进行addObject的问题

协程苔原
• 阅读 2634

问题

看如下代码,我们希望从沙盒的plist文件中解析出内容,赋值给一个可变数组。并且针对这个可变数组添加新的对象。

NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:self.plistFilePath];
NSLog(@"%@",array);

NSString *date = [self.dateFormatter stringFromDate:model.date];
NSDictionary *dict = @{@"date":date, @"content":model.content};
NSLog(@"%@",dict);

[array addObject:dict];
NSLog(@"%@",array);

执行代码后,我们发现结果为

null

{
    content = "add\U4eb2\U4eb2";
    date = "2017-09-27 16:46:00";
}

null

出现一个很有意思的问题,很明显self.plistPath所指向的文件是空的,所以解析失败,无法正确赋值给array,导致后面的addObject也失败了。

分析

上网查询了下资料

Return Value
A mutable array initialized to contain the contents of the file specified by aPath or nil if the file can’t be opened or the contents of the file can’t be parsed into a mutable array. The returned object must be different than the original receiver.

initWithContentsOfFile:苹果文档

重点就是if the file can’t be opened or the contents of the file can’t be parsed into a mutable array如果不能被打开或者解析为一个可变数组的时候,就返回nil

看来对于nil调用addObject的方式,依然结果会是nil

解决方案

我们调整代码如下,加入一个类型初始化。

NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:self.plistFilePath];

// 在这里,我们通过判断如果array为nil,也就是plist文件为空的时候进行初始化。
if(!array) {
   array = [NSMutableArray new];
}

NSString *date = [self.dateFormatter stringFromDate:model.date];
NSDictionary *dict = @{@"date":date, @"content":model.content};

[array addObject:dict];

进行上面修改后,就没有问题了。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
翼
4年前
js 数组 转为树形结构
需要转换为树形的数组vardata{"orderById":null,"platformCommissionProportion":1,"name":"添加剂","pid":13,"id":26
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
NSMutableArray 可变数组的使用
NSMutableArray是NSArray的一个子类,因此可以在任何使用NSArray的位置使用NSMutableArray。除了包含在NSArray中的方法,NSMutableArray还提供了修改数组的方法。//向数组添加对象addObject:和insertObject:atIndex://从数组删除对象r
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
达里尔 达里尔
1年前
给数组添加新数据,判断数据是否重复
多选要进行数组拼接,希望判断往原数组里添的新数据是否重复,封装个简易方法languageconstdataArrayname:'aaa',id:1,name:'bbb',id:2;constnewDataname:'ccc',id:2;//要添加的新数