您的位置:首页 > 移动开发 > Objective-C

'-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'

2016-02-26 11:49 429 查看

最近浏览功能的实现

需求:

项目中有这样的需求,及用户在主页中push进入下一级页面浏览信息,然后到“我的”页面有个最近浏览的功能,显示最近浏览过的数据,最多3条。

思路:

1、在浏览详情页纪录ID数组,存储到NSUserDefault中;

1.1、先取出NSUserDefault中的数据,判断是否为空;

1.2、为空,则说明之前没有数据,那么初始化数组,添加数据,保存;

1.3、不为空,则说明之前有数据,判断这词浏览的ID是否在数组中;

若在,则先删除重复元素,若不在,则不做操作;

1.4、判断数组的count是否大于等于3;

若大于等于3,则删除第一个元素,若非,则不做操作;

2、在我的页面,从NSUserDefault中取出数组,请求网络,拿到数据显示;

问题:

在我存储ID数组的时候,第一次存储正确,但是第二次的时候,进到这个页面就崩溃了,我是真的不理解啊。

错误提示:

‘-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object’

错误原因:

意思是变的方法发送给一个不变的对象(不懂耶)。

修改方法:

再声明一个可变数组2,对可变数组2进行数据操作。。。。

修改后的代码:

#pragma mark - 最近浏览
- (void)nearlyLookCarWithModel:(DetailChooseCarModel *)detailModel
{
//取出数组
NSMutableArray *array = [[NSMutableArray alloc] init];
array = [[NSUserDefaults standardUserDefaults] objectForKey:MYLOOKCAR];

if (array) {
NSLog(@"not nil");

//存在此数组
NSMutableArray *mArr = [[NSMutableArray alloc] initWithArray:array];
NSLog(@"上次的mArr:%@", mArr);

//保存成字典,包含CID、phono、title
NSDictionary *carDic = [NSDictionary dictionaryWithObjectsAndKeys:self.cid,@"cid",
detailModel.main_photo,@"imgName",
detailModel.car_subject,@"title",nil];

if ([mArr containsObject:carDic]) {

NSLog(@"包含重复元素");

//删除重复元素
[mArr removeObject:carDic];

}

if ([mArr count] >= 3) {

NSLog(@">3");

//删除第一个元素
[mArr removeObjectAtIndex:0];

}

[mArr addObject:carDic];
NSLog(@"这次的mArr:%@", mArr);

//操作数组
[[NSUserDefaults standardUserDefaults] setObject:mArr forKey:MYLOOKCAR];

}else {
NSLog(@"nil");

//初始化mArr
NSMutableArray *mArr = [[NSMutableArray alloc] init];

//保存成字典,包含CID、phono、title
NSDictionary *carDic = [NSDictionary dictionaryWithObjectsAndKeys:self.cid,@"cid",
detailModel.main_photo,@"imgName",
detailModel.car_subject,@"title",nil];

[mArr addObject:carDic];
[[NSUserDefaults standardUserDefaults] setObject:mArr forKey:MYLOOKCAR];
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: