【发布时间】:2016-06-10 02:39:06
【问题描述】:
我有一个旨在获取对象的函数,如果数组中已经存在具有相同标识符字符串的对象,则更新它,如果不存在,则添加该对象。添加部分有效,但由于某种原因,更新功能会丢失数据。
这是我的代码:
- (void)addOrUpdateGroup:(Object *)myObject
{
for (H2Group *existingObject in objectsArray) {
if ([existingObject.identifier isEqualToString:myObject.identifier]) {
[objectsArray replaceObjectAtIndex:[objectsArray indexOfObject:existingObject] withObject:myObject];
return;
}
}
[objectsArray addObject:myObject];
}
当使用数组中具有对应对象的对象调用此方法时,它会执行,但似乎不会替换该对象。
使用断点和日志,我已经确定:
- 进入循环,检测具有现有标识符的新对象工作正常。
- 新对象完好无损,如果我改为使用
[objectsArray addObject:myObject],则该对象已正确添加。 - 如果我使用
replaceObjectAtIndex:0 withObject:myObject,也会出现同样的问题。
任何想法将不胜感激。
【问题讨论】:
-
1) 我很惊讶这段代码没有崩溃,因为您在使用快速枚举时正在修改一个可变数组。 2)这段代码效率很低。为什么要使用快速枚举和
indexOfObject:?要么使用普通的for循环,这样您就已经知道匹配对象的索引,要么使用enumerateObjectsUsingBlock:来获得两者的好处。 -
感谢您的输入,我认为它没有崩溃,因为在数组发生突变之后循环被 return 语句中断,并且在循环继续进行另一次迭代之前。不过我也会试试你的方法。
-
当
replaceObjectAtIndex:被调用时,你如何确定数组没有正确更新? -
我在前后添加断点允许我检查 myObject 以及 objectsArray 的内容。
-
我怀疑代码工作正常,问题在于您确定它不工作。我建议为您的
Object类编写一个适当的description方法,以便它显示足够的信息以清楚地区分每个实例,然后在调用addOrUpdateGroup:之前和之后记录objectsArray。然后确保日志输出有差异。或者问题可能只是existingObject和myObject实际上是同一个对象实例或者它们具有相同的数据。
标签: objective-c arrays nsarray