为何ViewController释放后不走dealloc

2024-01-22 15:58

本文主要是介绍为何ViewController释放后不走dealloc,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在一个项目中,如果ViewController使用完成之后,发现这个东东并没有释放掉,dealloc方法不走,看着那个内存蹭蹭的网上增,就跟自己的火气一样。相信大家都知道如何去释放一个不用的ViewController,但是还是有些其他因素限制了内存释放。


首先 ,如果你创建了一个VController,使用它却没释放它,那这个VC肯定存在,那dealloc指定不调用,那么你创建的类就会内存泄露

    textViewController * text = [[textViewController allocinit];

    [self.navigationController pushViewController:text animated:YES];

    //[text release];


然后,如果你的VC中有NSTimer,那么就要注意了,因为当你

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];

时,这个 target:self 就增加了VC的RetarnCountr如果你不将这个timer invalidate,就别想调用dealloc。


再然后,一个比较隐蔽的因素,你反过头去找找看,跟这个类有关的代理,嗯,对是代理,有没有强引用的属性啊?对,比如一个代理的delegate应该是 assign 的现在是retain,(╯‵□′)╯︵┻━┻,就是这个,它会影响你不让你调用dealloc,不信,就试试吧。


最后,如果以上都没有问题的话,那么,真问题就来了。我就遇到了这种情况,在使用ASI进行网络请求的时候,因为需求原因,我使用属性将名为 ASIFormDataRequest NSOperation 标记住了,就将上面的问题找了又找,就是不行,最后是将那个标记的属性置为 nil 才解决了这个不调用 dealloc 的这个蛋疼问题。所以,如果你遇到了比较隐蔽的原因,那就去找找你自己控制不了的因素,就像这个第三方。如果你不了解它的运行机制,那就一定要注意这个库对你程序的影响。嗯,善用XXX.delegate = self;


PS:dealloc中的释放也是有顺序的,就好比创建时,先父类,再子类,释放的时候反过来,不然有几率会crash,至于原因。 ———————— 看了一个帖子,上面说:子类是父类的继承,比较NB,以至于要杀死他们的时候应该先干掉比较牛B的子类。    看完后我就记住了。很有意思~

这篇关于为何ViewController释放后不走dealloc的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/633474

相关文章

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

读锁的获取与释放是怎么实现的?

在 ReentrantReadWriteLock 中,读锁的获取与释放是通过管理读锁计数和线程状态来实现的。以下是更详细的说明,涵盖了读锁的获取与释放过程: 1. 读锁的获取 读锁获取的核心是允许多个线程同时持有读锁,只要没有线程持有写锁。 获取读锁的步骤 检查写锁状态:在获取读锁前,首先需要检查是否有线程持有写锁。如果没有线程持有写锁,当前线程可以安全地获取读锁。 增加读锁计数:如果

Linux - Tcp连接建立和释放的三次握手四次挥手

一、TCP报文段首部格式         源端口/目的端口:各占2个字节,分别写入源端口和目的端口,端口是传输层与应用层的服务接口    序号:占4个字节,TCP连接中传送的数据流中每一个字节都有一个序号,序号字段指本报文段所发送的数据的第一个字节的序号    确认号:占4个字节,是期望收到对方下一个报文的第一个数据字节的序号    数据偏移:占4个字节,它指出TCP报文的数据距离TCP

APK安装释放文件的过程

1、DDMS 在学习Android 应用程序安装相关文件的过程时,我们需要先了解一个工具DDMS( Dalvik Debug Monitor Service),即Android 开发环境中的Dalvik虚拟机调试监控服务。打开这个工具集有一个File Explorer(文件的浏览器),该文件浏览器可以帮助我们查看虚拟机上的所有文件。如图1-1所示: 2、Apk的安装

Java-互斥锁死锁释放锁

互斥锁         互斥锁(Mutex Lock)是一种同步机制,用于确保在任何时刻只有一个线程可以访问特定的代码段(临界区),从而防止数据竞争和不一致性。 使用方法: 在Java中,可以使用synchronized关键字或ReentrantLock类来实现互斥锁。使用lock()方法获取锁,使用unlock()方法释放锁。 特点: 确保线程安全,防止多个线程同时访问共享资源。简单易

Postgresql表和索引占用空间回收释放(表空间膨胀)

Postgresql表和索引占用空间回收释放(表空间膨胀) -- 1.创建测试表t_usercreate table if not exists t_user(id serial primary key,user_name varchar(255),pass_word varchar(255),create_time date,dr char(1));create index ind_ti

SAP CN22释放物料的可用性的操作方法

SAP PS系统,CN22要释放网络的可用性(直发物料号的需求), 必输要操作路径正确,或者操作的界面正确,否则保存后无法释放可用性。 先进入作业一览 然后进入作业的组件,对网络赋值的界面, 然后选中组建,再使用可用性-复位 然后保存即可。 只有在这个网络,对作业赋值的界面操作,才能释放可用性分配。 其他情况下,均不会生效。

数据库访问接口-数据源创建连接释放

(一)数据库编程组件间的关系示意图 (二)OLEDB编程基本框架和步骤 接口 IDBCreateSession总接口中CreateSession方法创建Session 对象Session的接口IDBCreateCommand接口中CreateCommand方法创建Command对象 Command对象接口ICommand接口中的Execute()创建Rowset对象。

【编程底层思考】线程阻塞时一定会释放cpu吗

线程阻塞时是否释放CPU取决于阻塞的原因和操作系统的行为。以下是一些具体情况: 1. 阻塞等待资源:当线程因为等待某个资源(如锁、信号量、条件变量等)而阻塞时,它通常会释放CPU,以便其他线程可以运行。在这种情况下,阻塞的线程不会占用CPU资源,直到它等待的资源变得可用。 2. 阻塞等待I/O操作:当线程因为等待I/O操作(如读取文件、网络通信等)而阻塞时,它也会释放CPU。操作系统会将线程挂

DIAMOND(DD)重新定义DeFi,释放新经济范式红利

近年来,DeFi作为区块链领域内屈指可数的“范式革命”代表,它所带来的观念更新和认知转变在时代潮流中显然尤为重要,而且极具里程碑式意义,称其为“第四次工业革命”也毫不为过。然而纵观DeFi从2020年野蛮生长到2021年回归理性的过程中,DeFi迄今为止还远远谈不上成功,其真正的高峰还尚未到来。 如同古希腊物理学家阿基米德曾说过:“给一个支点,可以撬起地球”,而这句话在DeFi身上也同样适用。虽