首页 > 解决方案 > 无限循环和线程 1:EXC_BAD_ACCESS(代码=2,地址=0x7ffeedaec488)

问题描述

我在 tabBar.viewControllers = [cameraVC, galleryVC] 的数组中得到一个线程 1: EXC_BAD_ACCESS (code=2, address=0x7ffeedaec488) 并且在我的控制台中我不断打印出我的用户名,它来自不同的班级。第一个代码片段显示了线程的显示位置:

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)
}

标签: iosdebuggingswift5xcode11.4

解决方案


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

我想这是一个错字,你在 HomeViewController 中创建 HomeViewController,这会导致无限循环,我认为你的 Auth 在 vi​​ewViewAppear/didLoad 中被调用,所以它会无限触发,直到你堆栈溢出。

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


推荐阅读