为何现代Xcode生成的项目将UIApplicationMain置于自动释放池外部?
Xcode main函数模板中UIApplicationMain移出自动释放池的原因
这个调整是苹果基于自动释放池最佳实践做的模板优化,核心逻辑和自动释放池的工作机制直接相关:
UIApplicationMain内部已自带自动释放池循环:UIApplicationMain会启动App的主RunLoop,而RunLoop在每一次循环迭代时,都会自动创建、使用并销毁自动释放池。App运行过程中产生的自动释放对象,会被RunLoop的池及时回收,不需要外层额外的池包裹整个UIApplicationMain调用。
旧模板的冗余与内存隐患:如果把UIApplicationMain放在外层自动释放池里,这个池会一直存在到App退出(因为UIApplicationMain直到App终止才会返回),导致一些本该在RunLoop循环中被释放的对象,被延迟到App结束时才回收,无形中增加了内存占用。
新模板的高效性:新模板只把初始化阶段的临时代码(比如获取AppDelegate类名的
NSStringFromClass调用,会返回自动释放对象)放在临时自动释放池中,这些临时对象会在池结束时立即被释放,避免不必要的内存占用;而UIApplicationMain交给内部的RunLoop池去管理,更符合内存优化的最佳实践。
苹果在Xcode版本更新(约Xcode 10时期)调整了这个模板,虽然没有单独发布专门的变更说明,但在内存优化相关的WWDC Session以及Xcode的Release Notes中,都强调过缩小自动释放池作用范围的优化原则,这个模板改动正是对该原则的落地。
内容的提问来源于stack exchange,提问作者Aleksandr Medvedev
相关产品推荐
相关产品推荐

