【问题标题】:removeFromSuperview EXC_BAD_ACCESSremoveFromSuperview EXC_BAD_ACCESS
【发布时间】:2019-11-26 14:58:18
【问题描述】:

我从 iOS 6.0 开始为 iPhone 开发了一款游戏。

它在运行 iOS 7.1 的 5S 上运行良好,但在使用 iOS 6.1.3 的旧 3GS 上测试它时,当尝试从超级视图中删除一些自定义 UIView 时,它会崩溃并显示“EXC_BAD_ACCESS 代码:0”。

我记录了我的自定义视图,它是超级视图(不是零),但没有任何工作!

还尝试使用 lldb 命令记录我的视图和超级视图,并确认它们不是 nil。

有什么想法吗??无法理解它如何在 iOS7 而不是 iOS6 上运行!

出现错误时的代码如下:

- (void)didMoveToParentViewController:(UIViewController *)parent{
    if(parent == nil){
        for (LevelNumberView *button in self.levelButtons) {
            if(self.view && [self.view.subviews containsObject:button]){
                NSLog(@"-- button:%@", button);
                [button removeFromSuperview];
            }
        }
        self.levelButtons = nil;
        [self.titleView removeFromSuperview];
        self.titleView = nil;
        [self.view removeFromSuperview];
        self.delegate = nil;
    }
}

【问题讨论】:

  • 看起来像是堆栈溢出(无限循环)还是错误的内存访问(尝试运行 Zombies 仪器)?这是EXC_BAD_ACCESS 的两个常见原因。
  • 顺便问一下,你用的是ARC吗?
  • 是的,我正在使用 ARC。这不是无限循环,我不能使用僵尸仪器! (可能是因为它在 3GS 上......它在 5S 上工作)

标签: ios objective-c iphone exc-bad-access


【解决方案1】:

您应该能够在任何有效的 UIView 上调用removeFromSuperview(无论它是否具有超级视图),这样就不会导致错误。我的猜测是其中一个指针(不是 nil)指向一个已释放的对象。

【讨论】:

  • 我认为这不是问题所在。我刚刚对此进行了测试,它没有崩溃(也没有打印任何内容):NSArray *array = nil; for (id obj in array) { NSLog(@"hi"); }
  • 你是对的。在这种情况下,您发布的代码很好,您的问题可能是其中一个指针(不是 nil)指向一个已发布的对象。
  • 好的,但奇怪的是它不会在运行 iOS 7.1 的 iPhone 5S 上崩溃!如果我的 NSArray 有强引用,里面的项目可以自动释放吗?
  • 此外,如果我评论循环,我在 [self.view removeFromSuperview]; ... self.view 不应该在那个时候已经发布了??!
【解决方案2】:

我在删除它之前使用检查超级视图来解决同样的问题:

if(self.loadingView.superview){
        [self.loadingView removeFromSuperview];
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2018-01-21
    • 2012-08-13
    • 2021-12-20
    相关资源
    最近更新 更多