App 登錄後進入主界面(通常是一個單例模式的 UITabBarController),用戶點擊退出登錄時,需要徹底銷毀這個單例及其持有的所有子控制器、視圖,回到登錄/註冊頁面,確保數據隔離且無內存洩漏。
不建議強行銷毀單例。 單例設計初衷就是全局唯一、生命週期貫穿應用。退出登錄時,正確做法是:
UIApplication.shared.keyWindow?.rootViewController = LoginViewController(),舊的 TabBar 及其子控制器會因無強引用被 ARC 自動釋放。deinit:Swift/OC 靠引用計數管理內存,手動釋放單例違背設計模式,易導致崩潰或殘留引用。// 單例 TabBar 控制器
class MainTabBarController: UITabBarController {
static let shared = MainTabBarController()
private override init(nibName: String?, bundle: Bundle?) { super.init(nibName: nibName, bundle: bundle) }
func resetForLogout() {
// 1. 清理業務數據
UserManager.shared.logout()
// 2. 移除子控制器
viewControllers?.forEach { $0.view.removeFromSuperview(); $0.removeFromParent() }
viewControllers = nil
// 3. 重置自身狀態
selectedIndex = 0
}
}
// 退出登錄入口
func logout() {
MainTabBarController.shared.resetForLogout()
let loginVC = LoginViewController()
UIApplication.shared.windows.first?.rootViewController = UINavigationController(rootViewController: loginVC)
UIApplication.shared.windows.first?.makeKeyAndVisible()
}
總結:不要試圖「銷毀單例」,而應「重置單例狀態」並「切換根視圖」。這樣既符合內存管理機制,又能保證數據乾淨隔離。