首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的主UIViewController被创建了两次?

在iOS开发中,UIViewController的生命周期是由系统管理的。当你在代码中创建一个UIViewController的实例并将其添加到视图层级中时,系统会负责管理其生命周期,并在需要时创建和销毁实例。

主UIViewController被创建两次的原因可能有以下几种情况:

  1. 错误的初始化方式:在代码中可能存在重复创建主UIViewController的逻辑。检查代码中是否有多次创建主UIViewController的地方,确保只创建一次。
  2. 故意的创建:有些情况下,你可能需要在特定的场景下创建多个主UIViewController实例。例如,在使用导航控制器时,每次切换到新的视图控制器时,系统会自动创建一个新的实例。这种情况下,你需要确保你的代码逻辑正确处理了多个实例的情况。
  3. 内存警告:当系统内存不足时,iOS会发送内存警告给应用程序。为了释放内存,系统可能会销毁当前不可见的视图控制器,并在需要时重新创建。这可能导致主UIViewController被创建两次。

为了解决这个问题,你可以采取以下措施:

  1. 检查代码逻辑,确保只在需要的时候创建主UIViewController实例。
  2. 如果你使用了导航控制器,确保你的代码正确处理了多个实例的情况。
  3. 在视图控制器的生命周期方法中,例如viewDidLoad和viewWillAppear,打印日志以跟踪视图控制器的创建和销毁过程,以便更好地理解问题所在。
  4. 如果问题是由内存警告引起的,可以考虑优化你的应用程序以减少内存使用量,例如释放不需要的资源或使用更高效的算法。

总结起来,主UIViewController被创建两次可能是由于错误的初始化方式、故意的创建或内存警告引起的。通过检查代码逻辑、正确处理多个实例的情况以及优化内存使用,可以解决这个问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么进程kill掉了

第二次执行这个程序也没问题,但奇怪是,此时第一次执行那个程序却被kill掉了: ? 这是为什么呢?...上面我们说到,该程序逻辑是分配10GiB物理内存,所以运行两次,也就是要分配20GiB物理内存。 但在我们测试机器上,物理内存一共才16GiB,所以,运行两个这样进程肯定是不行。...这也就解释了为什么上面第二次运行该程序时,mmap是没有报错。...这也就解释了,为什么上面在第二次执行那个程序时,kill掉是第一次执行那个进程,而不是第二次执行进程,因为第一次执行那个进程,占用物理内存更大。...另外也欢迎关注公众号,主要是结合实际,讲一些linux内核相关知识。

2.4K20

为什么进程kill掉了

第二次执行这个程序也没问题,但奇怪是,此时第一次执行那个程序却被kill掉了: ? 这是为什么呢?...上面我们说到,该程序逻辑是分配10GiB物理内存,所以运行两次,也就是要分配20GiB物理内存。 但在我们测试机器上,物理内存一共才16GiB,所以,运行两个这样进程肯定是不行。...这也就解释了为什么上面第二次运行该程序时,mmap是没有报错。...那为什么不kill掉第二个进程,而是kill掉第一个呢? 这个和linux内核中oom killer选择策略有关,我们直接看源码: ?...这也就解释了,为什么上面在第二次执行那个程序时,kill掉是第一次执行那个进程,而不是第二次执行进程,因为第一次执行那个进程,占用物理内存更大。

2.6K51
  • 为什么要创建一个不能实例化

    但如果有一天,你发现写了这样一个类: class People: def say(self): print(f'叫做:{self.name}') def __new...一个不能初始化类,有什么用? 这就要引入我们今天讨论一种设计模式——混入(Mixins)。 Python 由于多继承原因,可能会出现钻石继承[1]又叫菱形继承。...为了保留多继承优点,但又摒除缺点,于是有了混入这种编程模式。 Mixins 是一个 Python 类,它只有方法,没有状态,不应该被初始化。它只能作为父类继承。...不同 Mixin 方法互不重叠。...显然,这样写会报错,因为两个类实例是不能比较大小: 但在现实生活中,当我们说 某人比另一个人大时,实际上是指某人年龄比另一人年龄大。

    3.4K10

    为什么校招面试中“线程与进程区别”老是问到?该如何回答?

    (总是不太聪明样子):“限乘?”、“进什么城(程)?” 面试官:“操作系统中进程与线程,你回去了解一下。门在左边,记得关门。” ?...除此之外,推荐看一下阮一峰一篇博客:进程与线程一个简单解释,用图解释十分生动形象。 为什么这个问题是面试高频? 既然这个问题是面试当中会被经常问到,所以我去网上找一个答案,背出来不就好了。...我们来分析一下为什么众多面试官老是问这个问题,他应该并不是想听到一个对书本上概念重复。 那么,他究竟想考什么?...总结 总之,如果上述内容你都了解,那肯定是不怕问到(大佬,请收下膝盖);如果看了此篇文章之后,你能答出个大概,相信面试官也会放过你,毕竟,我们也真的不是背书机器。...如果你能看到这,能否给我点个关注,点个赞让也收到鼓励。如果觉得内容有误,也欢迎评论指出。 注意,要敲黑板啦。 ? th (2).jpeg 进程是什么?它指的是一个运动中程序。

    1.1K30

    一个Bug所引发方法交换小讨论

    最近鄙人在项目中接入了阿里云移动数据分析功能,这个移动数据分析SDK中提供了统计页面出现与页面消失接口,所以呢就给UIViewController建了一个分类,然后在分类中复写load方法,并在该方法中勾住...那么为什么不会起作用呢,且听我慢慢道来。 首先先提出一个疑惑。...但是为什么load方法在同一个类不同分类中重写,在每一个分类中都会被调用呢?...3,+initialize方法 一个类+initialize方法会在第一次初始化这个类之前调用,并且只调用一次。 也就是说,当向该类发送第一个消息时候,会触发该类+initialize方法。...总结:如果用于交换方法名相同,当一个类中方法交换偶数次时候,交换无效;当交换奇数次时候,最后执行那个交换是有效,其他交换都无效。

    60830

    面试官:告诉为什么static和transient关键字修饰变量不能序列化?

    一、写在开头在上一篇学习序列化文章中我们提出了这样一个问题:“如果在对象中,有些变量并不想序列化应该怎么办呢?”...当时给回答是:不想序列化变量我们可以使用transient或static关键字修饰;transient 关键字作用是阻止实例中那些用此关键字修饰变量序列化;当对象反序列化时, transient...当时没有解释具体为什么static和transient 关键字修饰变量就不能序列化了,这个问题实际上在很多大厂面试中都可能会被问及。我们今天在这篇中进行解释吧。...四、总结好啦,今天针对为什么static和transient关键字修饰变量不能序列化进行了一个解释,下次大家在面试时候再被问道就可以这样回答啦,不过,还有的BT面试官会问transient关键字修饰变量真的不能序列化吗...正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

    17320

    唯一可行 iOS 架构

    我们拥有一百万种架构,但没有一种能真正帮助我们,甚至没有一种看上去是好代码组织方式。为什么? 为了解决这个问题,我们应该重新考虑一切,从头开始。...并没有像“嘿,我们在10年内创建了一种通用模式,您应该用它来解决任何问题”。这是我们犯根本错误。MVC 不是模式。这不是应用程序模块分解方案。...意思是,有些人拒绝 MVC,但仍使用 UIView 和 UIViewController。尽管这是主要问题,但它使 Apple MVC 与其他体系结构有所不同。...这看起来很奇怪,因为我们只是创建了具有完全相同角色 UIViewController 副本。...VIPER 是如何创建?是否有自己历史记录,例如 MVC 或 MVP?是的,的确如此,但是历史并不那么光鲜。VIPER 于 2013 年创建,旨在解决 Apple MVC 问题。

    1.3K20

    制作动态framework与静态framework那些坑

    我们使用xib方式创建了tableView和cell以及一个viewcontroller 3 需要暴漏给外部使用h文件 好了基本工程已经出来了,现在我们来看看怎么玩这两种形式framework...我们此时可以将framework拖到工程中使用啦,但是xib对应此时是无法加载为什么? 对于此时动态库来说,是在需要是动态载入 ?...采用路径方式查询资源,我们就按照路径拼接上资源所在bungle即可) 2 xib加载 对于xib这个资源比较特殊,虽然是静态库但是依然编译成为了nib文件存放在framework中 同样App默认也是从...才是bundle能够搜索到资源 UIViewController *vc = [[EmViewController alloc] initWithNibName:@"EmbededFramework.framework...加载xib需要initWithNibName而我们工程不需要呢?

    2K20

    iOS-UIWindow详解

    我们可以发现,当我们新建一个项目,直接在stroyboard为view设置一个背景颜色,然后运行项目,就能看到换了背景颜色view,这说明系统已经帮我们创建了一个UIWindow,那么这个UIWindow...根据传递类名创建UIApplication对象,这是第一个对象 创建UIApplication代理对象,并给UIApplicaiton对象设置代理 开启运行循环 main events loop...,并且赋值 UIViewController *rootVc = [[UIViewController alloc]init]; self.window.rootViewController...设置根控制器可以将对应界面的事情交给对应控制器去管理。 那么[self.window makeKeyAndVisible];这个方法为什么就能显示窗口呢?...我们来看一下[self.window makeKeyAndVisible];底层实现了哪些功能 可以显示窗口 成为应用程序窗口 当我们不调用这个方法,打印self.window。

    2K40

    iOS 开发:『Runtime』详解(二)Method Swizzling

    而至于方案选择,无论是选择哪种方案,认为只有最适合项目的方案才是最佳方案。 ---- 3....下面我们结合还有其他博关于 Method Swizzling 博文、 以及 Stack Overflow 上边提到危险和缺陷,还有笔者个人见解,来综合说一下使用 Method Swizzling...而为什么不用 +initialize 方法呢。 因为 +initialize 方法调用时机是在 第一次向该类发送第一个消息时候才会被调用。...如果在 + (void)load方法中调用 [super load] 方法,就会导致父类 Method Swizzling 重复执行两次,而方法交换也被执行了两次,相当于互换了一次方法之后,第二次又换回去了...但就是工作量很大,需要在所有有按钮地方添加代码。很不想承认:在之前项目中,使用就是这种方式。

    1.9K31

    onAppear 调用时机

    图片请忽略例子中写法是否合理和值得推荐,仅考虑为什么在第一段代码中,出现了数组越界情况;以及第二段代码可以正确运行。...在一个视图生存期中,SwiftUI 可能会多次创建视图实例。由于惰性视图优化机制,对于尚未处于可见区域子视图,SwiftUI 不会创建其实例求值一个显示视图至少会经历一次过程。...这会让开发者误以为 onAppear 是在视图渲染后( 使用者看到后 )才调用。但在 SwiftUI 中,onAppear 实际上是在渲染前调用。...viewWillAppear 则是在 UIViewController 呈现前( 可以理解为渲染前 ),会由 UIKit 调用。...)渲染视图由此可以证明,onAppear 确实是在布局之后,渲染之前调用

    2.1K20

    onAppear 调用时机

    image-20230328163706115 请忽略例子中写法是否合理和值得推荐,仅考虑为什么在第一段代码中,出现了数组越界情况;以及第二段代码可以正确运行。...在一个视图生存期中,SwiftUI 可能会多次创建视图实例。 由于惰性视图优化机制,对于尚未处于可见区域子视图,SwiftUI 不会创建其实例 求值 一个显示视图至少会经历一次过程。...这会让开发者误以为 onAppear 是在视图渲染后( 使用者看到后 )才调用。但在 SwiftUI 中,onAppear 实际上是在渲染前调用。...viewWillAppear 则是在 UIViewController 呈现前( 可以理解为渲染前 ),会由 UIKit 调用。...之间执行顺序 ) 渲染视图 由此可以证明,onAppear 确实是在布局之后,渲染之前调用

    1.1K10

    iOS对UIViewController生命周期和属性方法解析

    声明周期中有序调用。...11:dealloc:controller释放时调用。...三、从storyBoard加载UIViewController实例传值陷阱         我们知道,当我们从StoryBoard中加载ViewController时,我们在Controller中拖拽视图是可以初始化...可以看到,手动调用loadView后,label是建了出来,但是暴漏了一个更严重问题,系统不在调用ViewDidLoad方法,这是十分有风险,因为我们大部分初始化代码都会放在这个方法里,所以手动调用...; 2、模态跳转中Controller从属         在我们进行控制器跳转时,只要控制器没有释放,我们都可以顺藤摸瓜找到它,使用如下两个方法: //其所presentcontller,比如

    3K20

    iOS开发中内存泄漏检测工具--MLeaksFinder

    版权声明:本文为博原创文章,未经博允许不得转载。...举一个最简单例子: 我们可以不断重复 push 和 pop 同一个 UIViewController,理论上来说,push 之前跟 pop 之后,app 会回到相同状态。...用这种方法来发现内存泄露还是很不方便: 首先,你得打开 Allocations 其次,你得一个个场景去重复操作 无法及时得知泄露,得专门做一遍上述操作,十分繁琐 之前在项目中就使用了一个更好监测内存泄漏工具...MLeaksFinder原理: MLeaksFinder一开始是从UIViewController入手UIViewController在POP或dismiss之后该控制器及其上view,view...这样,当一个 UIViewController pop 或 dismiss 时(我们认为它应该要被释放了),我们遍历该 UIViewController所有 view,依次调 -willDealloc

    2.3K20

    一个单片机爱好者和国产EDA工具故事

    虽然可以通过一些渠道买到便宜料,然后自己焊接,但是打样阶段总这么搞,终究会累。也有人会抱怨立商城价格贵,呵呵,你跟得捷电子和贸泽电子对比过吗? 那,他们为什么还需要easyeda?...而为了更好服务国内工程师,他们在国内搭建了服务器,启用了一个新域名,也就是现在相对比较常见域名:lceda.cn。立EDA首字母缩写!...LCEDA可以导出这三个文件,但是并购之前以及并购之后刚开始几个月,导出坐标文件是不能直接用,需要手动修改一些参数名称,然后才能嘉立SMT系统识别。...看到这,有人会说:你讲了这么多,全是好听,没被坑过? 没被坑过是不可能。并购之后,坑过两次。...当时怎么办?记得还被客户在电话里怼了一顿~~~ 于是厚着脸皮去找老贺~~~ ? 能够感受到,老贺正在以一种较真到极致态度,死磕自己产品。

    88430
    领券