添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、切换rootViewController之前,present某一控制器

self.window = UIWindow.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
self.window?.rootViewController = UINavigationController(rootViewController: ViewControllerA())
self.window?.makeKeyAndVisible()
self.present(ViewControllerB(), animated: true, completion: nil)

在切换rootViewController的时候,必须先dismiss当前控制器,否则将产生内存泄漏:

self.dismiss(animated: false) {
    let window = UIApplication.shared.keyWindow
    window?.rootViewController = UINavigationController(rootViewController: ViewControllerA())
    window?.makeKeyAndVisible()

原因分析:因为ViewControllerA present ViewControllerB,即ViewControllerA引用ViewControllerB,自动引用计数+1。在切换rootViewController之后,window的rootViewController不再引用UINavigationController,UINavigationController的计数器为0,随后被释放,与此同时栈内的ViewControllerA也会被释放。但是,ViewControllerA始终没有release ViewControllerB,导致ViewControllerB的计数器始终不为0,从而导致内存泄漏。

二、切换rootViewController之前,push某一控制器

self.navigationController?.pushViewController(ViewControllerB(), animated: true)

在切换rootViewController的时候,直接切换即可,不用担心内存泄漏:

let window = UIApplication.shared.keyWindow
window?.rootViewController = UINavigationController(rootViewController: ViewControllerA())
window?.makeKeyAndVisible()

原因分析:因为ViewControllerA push ViewControllerB,它们均被压入到UINavigationController栈中。在切换rootViewController之后,window的rootViewController不再引用UINavigationController,UINavigationController的计数器为0,随后被释放,与此同时栈内的ViewControllerA、ViewControllerB也都会被释放。

最后,在切换window的rootViewController时候,还需要注意切换前后的window是否是同一个window,否则也会造成内存泄漏,所以建议在项目中有切换rootViewController的地方都看一下视图的层级。

一、切换rootViewController之前,present某一控制器 self.window = UIWindow.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)) self.window?.root... - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.view.backgroundColor =... 显示主页面的候,以Tabbar作为新的RootViewController 切换RootViewController以后,页面看起来没有什么问题,查看层级关系发现原来的界面并没有释放,造成了内存泄漏 1.pushViewController
最近项目中经常会出现,不同的弹框同出现在一个界面上的情况,所以研究了一下,如何避免此种情况的发生。 (关于UIAlertView显示的问题可参考:https://www.jianshu.com/p/7ac398ef4532) 首先,获取rootViewController的方式有两种: //方法一: UIWindow *windowW = [UIApplication s...
- (void)restoreRootViewController:(UIViewController *)rootViewController typedef void (^Animation)(void); UIWindow* window = self.window; rootViewController.modalTransitionStyle = UIModalTrans
搭建平台测试的候 出现这样的问题Application windows are expected to have a root view controller at the end of application launch 解决方法: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithO
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[AppDelegate setWindow:]: unrecognized selector sent to instance 0x6000038d03f0’ 1.删除info.plist里的Main storyboard f...
在SwiftUI中隐藏状态栏,在rootViewController中可以采用以下方法: 首先,我们需要创建一个自定义的UIHostingController子类,并重写它的preferredStatusBarStyle属性,以控制状态栏的样式。这个类将作为rootViewController。 ```swift class CustomHostingController<Content: View>: UIHostingController<Content> { override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent // 这里可以根据需要设定状态栏的样式 然后,在SceneDelegate中,我们将创建一个CustomHostingController,并将其设置为window的rootViewController。 ```swift class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { // 保留原有的代码 // 使用自定义的HostingController作为rootViewController let contentView = ContentView() // 这里替换为你自己的内容视图 if let windowScene = scene as? UIWindowScene { let window = UIWindow(windowScene: windowScene) window.rootViewController = CustomHostingController(rootView: contentView) self.window = window window.makeKeyAndVisible() // 保留原有的方法 这样,我们就成功地将自定义的CustomHostingController作为rootViewController,同也隐藏了状态栏。
Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile BetterThanNever: 这个设置的名字是排除某某架构,就是排除armv7表情包 Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile chokshen: 建议你用谷歌翻译一下Excluded Architectures是啥意思 Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile weixin_43035060: 感觉连表达都有问题,首先是将值设为armv7,然后后面就说需要将armv7剔除。。。 Alamofire提交json数组格式的参数 生命不止,奋斗不息: 高手,终于解决拉 Xcode12: CompileSwiftSources normal armv7 com.apple.xcode.tools.swift.compile 90后的晨仔: 改了也没用啊