【问题标题】:IndexOutOfBounds looping though subviews?IndexOutOfBounds 循环遍历子视图?
【发布时间】:2011-11-25 13:11:12
【问题描述】:

我有一个刷新 UIScrollView 内容的网络。在 ScrollView 中有几个 UIImageView 和一些 UILabel。

我确实使用以下代码清理了滚动视图的内容:

for (int i = [publicationsScrollView.subviews count] -1; i>=0; i--) {
    NSLog(@"Deleting SubView: %@", [[publicationsScrollView.subviews objectAtIndex:i] class]);
    if ([[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UIButton class]] || [[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UIButtonLongTap class]] || [[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UILabel class]] || [[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[UIImageView class]]) {
        NSLog(@"Deleting SubView: %@", [[publicationsScrollView.subviews objectAtIndex:i] class]);
        [[publicationsScrollView.subviews objectAtIndex:i] removeFromSuperview];
    }
    if ([[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[iCarousel class]]) {
        NSLog(@"carousel: View is in Scrollview");
    }
}

这段代码运行了好几天。现在我在控制台刷新期间收到错误:

refreshWorkSpace: deleting all subviews (11)
2011-11-25 14:04:52.826 CatalogService[45054:fb03] Deleting SubView: UILabel
2011-11-25 14:04:52.827 CatalogService[45054:fb03] Deleting SubView: UILabel
2011-11-25 14:04:52.839 CatalogService[45054:fb03] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9]'
*** First throw call stack:
(0x1e8c052 0x231fd0a 0x1e78db8 0x6945 0x5826 0x1e8dec9 0xddc5c2 0xddc55a 0xe81b76 0xe8203f 0xe81bab 0xecfa99 0xed1407 0xe0193f 0xe01c56 0xde8384 0xddbaa9 0x28b6fa9 0x1e601c5 0x1dc5022 0x1dc390a 0x1dc2db4 0x1dc2ccb 0x28b5879 0x28b593e 0xdd9a9b 0x2e6d 0x2de5 0x1

我无法理解这里发生了什么。我遍历子视图(计数应该给我现有子视图的数量!?)。为什么索引会超出范围!?

【问题讨论】:

  • 这很奇怪。您确定其他功能不会同时删除子视图吗?您确定没有其他可以影响此错误的源代码片段吗?
  • 我现在正在浏览代码以检查它。到目前为止我找不到任何东西。
  • 它总是在同一个子视图崩溃...
  • 崩溃是您向我们展示的状态吗?与行 '[[publicationsScrollView.subviews objectAtIndex:i] removeFromSuperview];'注释掉了?
  • 只是想知道subviews objectAtIndex: removefromsuperview AppStore 安全吗?

标签: objective-c ios indexoutofboundsexception


【解决方案1】:

我怀疑在这一行抛出了异常:

if ([[publicationsScrollView.subviews objectAtIndex:i] isKindOfClass:[iCarousel class]]) {

[[publicationsScrollView.subviews objectAtIndex:i] removeFromSuperview] 刚刚执行的情况下,索引“i”处将不再有对象。仅当数组中的最后一个子视图是您删除的类型之一时才会发生这种情况 - 否则访问将是无害的。

要解决此问题,您只需在 removeFromSuperview 调用之后添加 continue

【讨论】:

  • 这似乎有效。感谢您对此类基本问题的帮助!
【解决方案2】:

也许尝试用快速枚举替换 for 循环,例如:

for (UIView *aView in publicationsScrollview.subviews) {

  .... rewrite code to reference aView instead of using objectAtIndex
}

看看你是否有同样的行为。

【讨论】:

  • 我很奇怪你说它在 i=3 时崩溃,但崩溃日志似乎表明它在 i=10 时超出了界限
  • 他正在通过删除子视图来修改子视图数组,所以快速枚举会抛出一个关于在迭代期间改变数组的异常。
【解决方案3】:

在第一个 if 中,如果它进入,则删除子视图。因此,您减少了子视图计数数组。 之后,您再次尝试获取子视图,在第二个 if 中,该子视图已被删除,这就是它崩溃的原因。

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 2014-09-25
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多