viewDidUnload 和 viewWillUnload 被废弃之后的内存警告处理

从RTL到GDSII:DC综合里那些没人告诉你的时钟约束冷知识(附真实工程示例) 本文深入探讨数字IC设计中DC综合阶段的时钟约束冷知识,包括无毛刺时钟切换、寄存器分频时钟约束、虚拟时钟应用等关键技巧。通过真实工程示例,揭示常见约束误区及解决方案,帮助工程师提升时序收敛效率。特别针对input_delay和output_delay在多时钟域场景下的设置陷阱提供实用指南。 阅读详情
由于iOS6以上的UIKit不会在内存警告时自动释放视图,所以viewWillUnload和viewDidUnload将不再触发。
因此,在iOS6上,开发者需要负责内存警告时将不用到的视图释放。
WWDC2012的视频有提到,具体代码如下:

- (void)didReceiveMemoryWarning {
     if ([self.view window] == nil) {
          self.view = nil;
          self.otherSubView = nil;
     }
}
由于[self view]会引发视图的加载所以上述代码还是有潜在风险的,假如视图控制器在创建之后,在还没有加载视图时收到内存警告,那上面的代码就会触发视图的加载(调用了[self view]引起),反而加大了内存占用。所以应该先判断一下视图是否已被加载。
- (void)didReceiveMemoryWarning {
     if ([self isViewLoaded] && [self.view window] == nil) {
          self.view = nil;
          self.otherSubView = nil;
     }
}
Notification 的注册和反注册以及Delegate的设置和置空

如果注册的通知跟界面相关,可以考虑将注册放入viewWillAppear并在viewWillDisappear中反注册。
如果需要在视图加载时就注册,那就在viewDidLoad注册,dealloc和didReceiveMemoryWarning中根据视图是否加载过来进行反注册。
注意viewDidUnload和viewDidLoad不是成对调用的,所以即使是iOS5或者以下的版本也不能在viewDidUnload里面反注册。参见[iOS] ViewController的生命周期及其加载View的步骤。

综上所述,最佳实践的代码如下:
- (void)viewDidLoad
{
     self.subView.delegate = self;
     [[NSNotificationCenter defaultCenter] addObserver:self];
     self.viewCreatedByCode = [[UIView alloc] init];
}

// 自定义函数viewUnloaded,其操作与viewDidLoad对称。
- (void)viewUnloaded
{
     self.subView.delegate = nil;
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     self.viewCreatedByCode = nil;
}


- (void)didReceiveMemoryWarning {
     if ([self isViewLoaded] && [self.view window] == nil) {
          self.view = nil; // 需要开发者手动释放控制器的视图。
          self.viewCreatedByNib = nil;  // 在xib中创建的视图也要手动清空。
          [self viewUnloaded]; // 视图已被卸载,调用viewDIdLoad的反操作。
     }
}
 
- (void)dealloc
{
     if ([self isViewLoaded]) {
          [self viewUnloaded]; // 如果视图已被加载,说明viewDidLoad被调用过,所以调用viewDidLoad的反操作。
     }
}


2013-6-4 更新

UIKit在内存警告时不会释放视图的原因是不需要再释放。iOS6以上,视图对象跟视图的渲染位图已经很好地分开了,当内存警告时,UIKit会尝试释放没有贴在window上的视图的NSBackingStore,backingStore是视图的渲染位图,最占内存的部分,而UIView和CALayer本身只占几十K内存,所以视图的释放意义不大,并且不释放的话,视图被重用时,其层次关系和设置等都不用重建。

最终代码如下:

- (void)viewDidLoad
{
     self.subView.delegate = self;
     [[NSNotificationCenter defaultCenter] addObserver:self];
     self.viewCreatedByCode = [[UIView alloc] init];
}

// 自定义函数viewUnloaded,其操作与viewDidLoad对称。
- (void)viewUnloaded
{
     self.subView.delegate = nil;
     [[NSNotificationCenter defaultCenter] removeObserver:self];
     self.viewCreatedByCode = nil;
}


- (void)didReceiveMemoryWarning {
     if ([self isViewLoaded] && [self.view window] == nil) {
          // 如果需要,释放占内存的数据。
          // 注意此时不会释放view,所以之后访问self.view时不一定会触发viewDidLoad
     }
}
 
- (void)dealloc
{
     if ([self isViewLoaded]) {
          [self viewUnloaded]; // 如果视图已被加载,说明viewDidLoad被调用过,所以调用viewDidLoad的反操作。
     }
}


详解AUTOSAR:DaVinci Configurator导入ARXML配置(拓展篇—2) DaVinci Configurator导入ARXML配置。 阅读详情

相关推荐

stm32使用TB6600驱动器控制42BYGH型步进电机

stm32使用TB6600驱动器控制42BYGH型步进电机

qq_35653974的博客 9582

【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用; viewDidApper-UIViewC

weasleyqi的专栏 8万+

CentOS7全隔离环境部署Nvidia Tesla A100 40G驱动与CUDA工具包实战

本文详细介绍了在CentOS7全隔离环境下部署Nvidia Tesla A100 40G显卡驱动与CUDA工具包的实战经验。通过构建本地YUM仓库、解决驱动依赖问题以及三重验证法,确保Tesla A100与CUDA 11.7的完美兼容。同时分享了Anaconda3离线部署技巧,帮助用户在隔离环境中高效搭建Python GPU开发环境。

weixin_27215337的博客 399

iOS官方开发接口变动

1、giOS6已将viewWillUnload和viewDidUnload废弃,原因是UIKit在内存警告的时候已经不会自动释放无用的视图。

ylwdi的专栏 653

DeepSeek Harness 工程实践与高级特性:从测试到安全的完整指南

AI Agent 能执行命令、读写文件、自主决策,能力越强风险越大——删文件、泄密钥、死循环、竞态条件随时可能发生。本文是 DeepSeek Harness 系列第三篇,深入剖析其工程实践与高级特性:从单元测试到真实 API 冒烟测试的分层策略,拒绝 Mock 依赖、坚持"验证世界而非自我报告";从正交结果、规范化契约到 Dispose 静止的防御式编程铁律;以及跨平台多层进程沙箱、文件系统版本守卫、fail-closed 审批机制、模型编写的工作流引擎与上下文压缩等高级能力。

program哲学 207

openharmony之UniProton内核技术揭秘:鸿蒙面向工业控制领域的RTOS设计之道

UniProton是鸿蒙操作系统面向工业控制领域的轻量级实时操作系统(RTOS),专为资源受限的嵌入式设备设计。作为鸿蒙生态的重要组成部分,UniProton提供了高效的实时任务调度、内存管理和IPC机制,满足工业控制场景对实时性和可靠性的严格要求。想象一下,UniProton就像一个超级聪明的管家,管理着电子设备里所有的工作。让你的智能手表既能显示时间,又能接收消息让家里的扫地机器人既能避开障碍物,又能记住哪里已经打扫过了让工厂里的机器人手臂既能精确地抓取东西,又能快速地完成任务实时性强。

m0_67505153的博客 883

iOS 视图控制对象的生命周期

init-初始化程序viewDidLoad-加载视图viewWillAppear-UIViewController对象的视图即将加入窗口时调用;viewDidApper-UIViewController对象的视图已经加入到窗口时调用;viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;viewDidDisappear-UIViewContro

ideas press的专栏 593

ADS1115 0-10V高精度ADC模块原理图设计,已量产

在水质监测、智能气象站、环境感知等领域,0-10V 电压输出的传感器占据了重要地位。这类传感器输出信号稳定、抗干扰能力强,但对数据采集模块的精度、线性度和易用性提出了严苛要求。本文将深度解析一款专为 0-10V 传感器设计的高精度 ADC 模块,从硬件架构、性能指标到工程化实践,全面呈现其设计思路与核心价值。

不脱发的程序猿 272

Ionic页面的生命周期

官方文档 如官网文档所示,常用的生命周期有如下6个: Event Desc ionViewDidLoad 当页面加载的时候触发,仅在页面创建的时候触发一次,如果被缓存了,那么下次再打开这个页面则不会触发 ionViewWillEnter 顾名思义,当将要进入页面时触发 ionViewDi

wei11556的博客 4万+

k8s中pod使用详解

k8s中Pod使用

congge 1万+

生成mm grounding dino的onnx模型并在x-anylabeling中使用

X-AnyLabeling 是一款cvhub开发的交互式自动标注工具,其基于AnyLabeling进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助Segment Anything和YOLO等主流模型提供强大的 AI 支持。其最新版基于grounding dino可以实现开放词汇检测及生成掩码。2024年,MMDet 3.3.0提出了 MM-Grounding-DINO。

blanokvaffy的博客 1728

关于viewWillUnload 和 viewDidUnload方法

viewDidUnload方法在iOS6 已经废弃! - (void)viewWillUnload NS_DEPRECATED_IOS(5_0,6_0); - (void)viewDidUnload NS_DEPRECATED_IOS(3_0,6_0);  但是为了支持iOS5,还是原来的做法。 在iOS6中 无需关心,系统已经都给处理OK了!

温故而知新 1203

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

iosLearningDiary_viewDidUnload 和 viewWillUnload 被废弃之后的内存警告处理

由于iOS6以上的UIKit不会在内存警告时自动释放视图,所以viewWillUnload和viewDidUnload将不再触发。 因此,在iOS6上,开发者需要负责内存警告时将不用到的视图释放。 WWDC2012的视频有提到,具体代码如下: [plain] view plaincopy - (void)didReceiveMemoryWarning

tyforfreedom的专栏 384

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

viewDidUnload和viewWillUnload被废弃之后的内存警告处理

由于IOS6以上的UIKIT不会在内存警告时自动释放视图,所以viewWillUnload和viewDidUnload将不会再触发 因此在IOS6上,开发者需要负责内存警告时将不用到的视图释放。 具体代码如下: - (void)didReceiveMemoryWarning { if([self.view window] == nil) { self.view = nil; sel

222

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

软考系统架构设计师备考:231道精选真题刷题策略全解析

软件架构是企业级系统的骨架,直接影响系统的性能、可扩展性与稳定性。系统架构设计师作为软考高级认证,正成为技术人检验架构能力的重要标尺。该认证涵盖综合知识、案例分析与论文三科,知识面广、难度高,单纯通读教材效率低下。通过分析历年真题可知,高频考点重复率极高,如微服务拆分、质量属性评估、分布式一致性等,掌握真题即可覆盖绝大多数核心考点。围绕真题筛选逻辑、三轮刷题法、科目专项策略,系统梳理出一条高效备考路径,帮助考生用最少的题量建立完整的考点映射,在实战中快速识别出题意图并组织答案。

weixin_30613727的博客 383

【ios6】viewDidUnload方法的离去和替代

本篇文章为转载,出处在末尾,copy之前,先说一下自己的总结: viewDidUnload方法在ios6中已经被舍弃,好多人都说替代方法是Memory warning,可以直接在这个方法里把一些ui属性设置为nil,找了很多资料,我不这么认为,所以总结就是:目前情况下,你可以不必再纠结在哪里设置UI属性=nil,在dealoc里release掉就可以,不需要再考虑nil的问题,如果非要追求极

其实并不难,是你太悲观 6094

解析iOS内存不足时的警告以及处理过程

内存警告 ios下每个app可用的内存是被限制的,如果一个app使用的内存超过了这个阀值,则系统会向该app发送Memory Warning消息。收到消息后,app必须尽可能多的释放一些不必要的内存,否则OS会关闭app。 几种内存警告级别(便于理解内存警告之后的行为)  Memory warning level: 复制代码代码如下: typedef enum {

痞子龙3D编程 6657

内存警告

内存警告导引:ios下每个app可用的内存是被限制的,如果一个app使用的内存超过了这个阀值,则系统会向该app发送Memory Warning消息。收到消息后,app必须尽可能多的释放一些不必要的内存,否则OS会关闭app。 几种内存警告级别(便于理解内存警告之后的行为) Memory warning level: typedef enum { OSMemoryNo

IOS_Mainstay的博客 880

UIViewController

前言 不准使用xib自定义控制器view的大小 视图控制器负责页面的创建、事件处理等。 每一个视图控制器(UIViewController)内部都有个默认的UIView属性,控制器中管理的其他所有控件都是这个view的子控件(直接或者间接)。 1、ViewController 的创建 // 实例化视图控制器 UiViewController *viewController = [[U...

diaochuanzhi7826的博客 131

UIViewController中各方法调用顺序及功能详解

UIViewController中loadView, viewDidLoad, viewWillUnload, viewDidUnload, viewWillAppear, viewDidAppear, viewWillLayoutSubviews,viewDidLayoutSubviews,viewWillDisappear, viewDidDisappear方法,按照调用顺序说明如下:

天行健,君子自强不息 2万+

Ionic生命周期与注意点

需要注意的地方是:在走页面的生命周期以前,会先走构造方法 构造方法只走一次,除非再次创建这个页面。所以如果先push了一个新页面,然后再调用pop()返回到之前的页面,那么是不会走构造方法里面的方法的。这是需要考虑的地方   Ionic页面的生命周期 官网文档链接:https://ionicframework.com/docs/api/navigation/NavController/ ...

weixin_34383618的博客 165

ionic3页面的生命周期钩子

五、Ionic3的生命周期钩子Ionic3框架提供了8个钩子函数,它们分别会在页面生命周期的各个阶段被触发。(1)ionViewDidLoad页面加载完成触发,这里的“加载完成”指的是页面所需的资源已经加载完成,但还没进入这个页面的状态(用户看到的还是上一个页面)。需要注意的这个钩子全程只会调用一次,即第一次进入页面时被调用,此后你无论怎样进进出出它都不会再被调用了。因此这个钩子适合你做一些一次性...

蒲小若的博客 2352

Ionic4 生命周期钩子函数和angular生命周期钩子函数介绍

在 Ionic 4 中的页面组件中使用这些生命周期钩子来控制页面的生命周期和执行相应的任务。Angular 框架提供了一系列生命周期钩子(Lifecycle Hooks),这些钩子允许你在组件生命周期的不同阶段执行特定的任务。这些生命周期钩子允许你在组件生命周期的不同时刻执行任务,从组件创建到销毁,以及在组件的视图和数据发生变化时执行适当的操作。:在组件初始化完成后调用,用于执行一次性的初始化任务。用于执行视图初始化后的任务,例如获取子组件的视图。通常用于执行在页面不再可见时执行的任务。

m0_47791238的博客 1131

初始Ionic3问题汇总

1、新建page之后,ctrl+f5了,但是页面tabs不能切换到新建的page上,最后两个新建在tab上的切换点击无效,console没有错误信息。重启ionic后正常 image.png 2、在创建page和component时,都不能创建子文件夹。 例如: 我先创建aaa,然后我想在aaa中创建a1, ionic g componet aaa ionic g componet aa...

IT飞牛 329
上一篇: 使用 symbolicatecrash 解析崩溃堆栈
下一篇: UIView的alpha属性和hidden属性
wihing
博客等级 码龄19年 55粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值