【问题标题】:NSMutableArray: data missing when init with an ArrayNSMutableArray:使用数组初始化时数据丢失
【发布时间】:2016-03-03 22:05:23
【问题描述】:

如截图所示,有谁知道这是什么问题?感谢您的热心帮助!

【问题讨论】:

  • 你确定在断点停止后它没有在for循环上运行吗?

标签: ios objective-c nsmutablearray init


【解决方案1】:

您正在从正在迭代的数组中删除对象。 这是一种不好的做法,可能会导致这样的错误。

你只需要替换

for (NSString *code in list)

与:

for (NSString *code in codeList)

【讨论】:

  • 不仅是不好的做法,而且是非法的做法,如果操作系统注意到它就会受到崩溃的惩罚。
  • 谢谢你们的帮助,这是我的错误。 BTW,今天之前的代码几乎跑了1个月就通过了,不知道为什么今天才失败,怎么处理?
  • 您只需复制您的阵列。迭代第一个,并从第二个中删除对象。这样您就可以确保您已经迭代了所有元素。然后只保留第二个数组供您使用。在 for 循环条件中将 list 替换为 codeList。
  • 是的,我已经将它修复为@bmindhacker 的代码,和你说的一样。顺便说一句,也感谢您的帮助。
【解决方案2】:

不要在迭代时从数组或字典或任何集合集中删除对象。 保留迭代时要删除的索引,然后删除所有对象。您可以使用indexesOfObjectsPassingTest 方法:

NSMutableArray * list = [NSMutableArray arrayWithArray:codeList];

NSIndexSet * indexesToRemove = [list indexesOfObjectsPassingTest:^BOOL(NSString *code, NSUInteger idx, BOOL *stop) {
    return [self.codeMapping.allKeys containsObject:code];
}];

[list removeObjectsAtIndexes:indexesToRemove];

【讨论】:

  • @Azevedo 感谢您的帮助,但这个块看起来对我来说并不好,它已经阻止了我的应用很长时间......
【解决方案3】:

您应该使用indexesOfObjectsPassingTest 和objectsAtIndexes 来执行此操作:即使您遵循例如Anbu 的回复以使您的代码正常工作,此代码也会在O (n^2) 中运行。使用包含 100,000 个对象的列表来执行此操作,其中每隔一个对象就会被删除,您的应用程序会因为 CPU 时间耗尽而死去。

【讨论】:

  • 谢谢,我已将其修复为 @bmindhacker 的代码,效果很好。
【解决方案4】:

在你看只需输入codeList,你的问题就会得到解决。 检查一下我修改了你的方法。

-(NSArray *) checkVisibleCode:(NSArray *) codeList{
    NSMutableArray *list = [NSMutableArray arrayWithArray:codeList];
    for (NSString *code in codeList) {
        if (![self.codeMapping.allKeys containsObject:code]) {
            [list removeObject:code];
        }
    }
    return list;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    相关资源
    最近更新 更多