无限循环和线程1:EXC_BAD_ACCESS代码= 2,地址= 0x7ffeedaec488

如何解决无限循环和线程1:EXC_BAD_ACCESS代码= 2,地址= 0x7ffeedaec488

我在线程上获取了线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fFeedaec488),位于tabBar.viewControllers = [cameraVC,galleryVC]的数组中,在控制台中,我的用户名无休止地打印了出来,来自不同的阶层。第一个代码显示了线程的显示位置:

func addTabBar() {
    let cameraVC = HomeViewController()
    let galleryVC = galleryViewController()

    let tabBarItem1 = UITabBarItem(title: "Camera",image: UIImage(named: "camera-icon")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal),selectedImage: UIImage(named: "blueCamera-icon")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal))
    let tabBarItem2 = UITabBarItem(title: "gallery",image: UIImage(named: "gallery-icon")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal),selectedImage: UIImage(named: "bluegallery-icon")?.withRenderingMode(UIImage.RenderingMode.alwaysOriginal))



    cameraVC.tabBarItem = tabBarItem1
    galleryVC.tabBarItem = tabBarItem2
    tabBarItem2.imageInsets = UIEdgeInsets(top: 0,left: 0,bottom: -6,right: 0)

    tabBar.viewControllers = [cameraVC,galleryVC]

    self.view.addSubview(tabBar.view)
}

这是我的第二个代码段,其中定义了所有功能,我在控制台中不断重复获取用户名的打印语句:

@IBAction func signUpTapped(_ sender: Any) {
    //validate the fields
    let error = validateFields()
    
    if error != nil {
        //something's wrong,show error message
        showError(error!)
    }
    else {
        
        //create trimmed data
        let userName = userNameTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let email = emailTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        let password = passwordTextField.text!.trimmingCharacters(in: .whitespacesAndNewlines)
        //create the user
        Auth.auth().createuser(withEmail: email,password: password) { (result,err) in
            
            //check for errors
            if err != nil {
                //error creating user
                self.showError(err?.localizedDescription ?? "Error creating user")
            }
            else {
                    let changeRequest = Auth.auth().currentUser?.createProfileChangeRequest()
                    changeRequest?.displayName = userName
                    print(userName)
                changeRequest?.commitChanges { (error) in print ("Username not created") }

                //transition to home screen
                self.saveLoggedState()
                self.transitionHome()
            }
        }
    }
}
func showError(_ message:String){
    
    errorLabel.text = message
    errorLabel.alpha = 1
}
func saveLoggedState() {
    
    let def = UserDefaults.standard
    def.set(true,forKey: "is_authenticated")
    def.synchronize()
    
}
func transitionHome() {
    
    let homeVC = self.storyboard?.instantiateViewController(identifier: Constants.Storyboard.homeViewController) as? HomeViewController
    self.view.window?.rootViewController = UINavigationController(rootViewController: homeVC!)
    self.view.window?.makeKeyAndVisible()
    
}

我希望足够的代码!我真的对问题是什么感到困惑,并且以前的堆栈溢出帖子没有帮助。任何帮助将不胜感激。谢谢!

编辑1:我还在家庭控制器中实现了侧面菜单。它的代码如下:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.backgroundColor = color
    view.backgroundColor = color
    tableView.tableFooterView = UIView()
}

// Table
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    return menuItems.count
}

override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
    cell.textLabel?.text = menuItems[indexPath.row].rawValue
    cell.textLabel?.textColor = .white
    cell.backgroundColor = color
    cell.contentView.backgroundColor = color
    return cell
}

override func tableView(_ tableView: UITableView,didSelectRowAt indexPath: IndexPath) {
    tableView.deselectRow(at: indexPath,animated: true)
    // Relay to delegate about menu item selection
    let selectedItem = menuItems[indexPath.row]
    delegate?.didSelectMenuItem(named: selectedItem)
}

解决方法

func addTabBar() {
   let cameraVC = HomeViewController()
   let galleryVC = GalleryViewController()
}

我想这是一个错字,您在HomeViewController内创建HomeViewController,这会导致无限循环,而且我认为您的Auth在viewViewAppear / didLoad内部被调用,因此它会无限触发,直到堆栈溢出为止。

如果不是这种情况,我猜您的HomeViewController会触发signUpTapped,然后在用户创建时返回HomeViewController(再次触发signUpTapped),因此递归没有结束。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?