iOS 内存斗争小史之 NavigationController
1、怎样写一个不泄漏的NavigationController页面跳转程序?
非arc模式下,假设有A、B两个viewController,从A推到B,怎样写内存才能不泄漏?
A.m
-(IBAction)btnGoToViewControllerB:(id)sender
{
ViewControllerB *aController = [[ViewControllerB alloc]init];
[self pushViewController:aController animated:YES];
[aController release]; //此处要释放
}
B.m
-(IBAction)btnGoToViewController1:(id)sender
{
[self.navigationController popViewControllerAnimated:YES]; //执行完本句后,系统会自动调用B类的dealloc方法,释放内存
}
我按照上面的步骤做的,为什么我的B类在pop时,系统没有调用dealloc方法呢?呵呵,如果真像上面说的那么简单,我就不写这片博客了。接着往下看!
首先,你的例子是新创建的工程吗,里面只有A B两个controller,而且除了必要的代码,没加其它的控件。如果是,你不会遇到这样的疑惑。是不是在网上down了一个工程来测试上面的代码,还是在自己的原开发工程里调试的。呵呵,不卖关了。
* 一个对象的dealloc方法若想被系统自动调用,前提是拴在此对象身上的狗链子已经全部消失,即retainCount为0.(在内存管理时,不建议去人工计算retainCount大小,来判断对象是否该释放了。应该使用对象“所有权”的思想去理解内存管理)。
* 我们知道alloc \ copy \ retain 操作会让你个对象被一个指针持有。但是,大家往往忽略对象本身self的赋值,也会被一个指针持有。如下:
self.tableView.delegate = self; //让self被tableView.delegate 持有,需要显示release
我们的viewControllerB没有如期被调用dealloc是因为这个对象还有指针持有它,还有狗链子拴着它呢!怎么释放?所以,要想对象被即使释放,请检查工程内,是否有哪个指针还持有这个对象。alloc \copy \ retain\和 *** = self;全部都要检查哦。
如果一个对象被一个指针,通过 *** = self;持有,那么应该在合适释放比较合适呢。dealloc肯定不行,因为只有对象没有持有者时系统才会进dealloc。一般地,应该写在返回按钮或其它页面跳转事件中。如下:
//返回 按钮
-(IBAction)btnBackClicked:(id)sender
{
[self.m_gridView.gridViewDelegate release]; //持有者 释放所有权
[self.navigationController popViewControllerAnimated:YES];
}
经验:
1、查看一个对象没有被及时释放,要重点检查其是否还有持有者。(用所有权地理念管理内存,而不是retainCount)
2、在实际编码中,dataSource也持有了对象如下:
aGridView.gridViewDelegate = self;
aGridView.gridViewDataSource = self;
但是却并不需要释放。如果释放了dataSource反而会引发过度释放的问题。具体原因,欢迎朋友告知。
参考:
解决循环引用问题: 一次IOS开发内存泄漏问题 iOS5中UIViewController的新方法
内存使用状态持续增长。。。(pop之前设置delegate为nil)
由pushViewController说起可能出线的各种死法

iOS 内存斗争小史之 NavigationController的更多相关文章
- IOS 内存斗争小史之 对象、指针、内存的基本理解
1.指针和对象,都是内存块.一个大,一个小.一个在栈中,一个在堆中. 2.iOS中,我们可以生命一个指针,也可以通过alloc获取一块内存. 3.我们可以直接消灭掉一个指针,将其置为nil.但是我们没 ...
- 转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber
http://www.bubuko.com/infodetail-382485.html 标签:des class style 代码 html 使用 问题 文件 数据 ...
- 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug
前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...
- 经验之道:最有效的iOS内存泄漏检测
版权声明:本文由胡涛原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/125 来源:腾云阁 https://www.qclou ...
- [CALayer release]: message sent to deallocated instance iOS内存过度释放问题
[CALayer release]: message sent to deallocated instance iOS内存过度释放问题 解决方式: 1:先找到过度释放的 内存指针 开启-僵尸模式:xc ...
- 写给Unity开发者的iOS内存调试指南
0x00 前言 工作的过程中,常常会发现有小伙伴对Unity的Profiler提供的内存数据与某些原生平台Profiler工具,例如iOS系统和Xcode,所提供的内存数据有差异而感到好奇.而且大家对 ...
- iOS内存管理布局及管理方案-理论篇
苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记 ...
- iOS内存管理
iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
随机推荐
- python中open函数的用法
用法如下: name = open('errname.txt','w')name.readline()name.close() 1.看下第一行的代码 用来访问磁盘中存放的文件,可以进行读写等操作,例如 ...
- php的递归函数示例
递归函数太难理解了,写了一个示例放在这里方便没事的时候看一下. <?php /** *php递归函数示例 *(从1到100的累加和计算) * */ function summation($num ...
- goodrain云平台 mysql主从同步应用创建
mysql 主从同步原理 1)在Slave 服务器上执行sart slave命令开启主从复制开关,开始进行主从复制. 2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请 ...
- java 多重继承
接口不仅仅只是一种更纯粹形式的抽象类,它的目标比这更高,因为接口是根本没有任何具体实现的--也就是说,没有任何与接口相关的存储,因此也就无法阻止多个接口的组合, 在导出类中,不强制要求必须有一个抽象的 ...
- Ueditor结合七牛云存储上传图片、附件和图片在线管理的实现和最新更新
最新下载地址: https://github.com/widuu/qiniu_ueditor_1.4.3 Ueditor七牛云存储版本 注意事项 老版本请查看 : https://github.com ...
- 方法调用---springMVC中调用controller的方法
我们有一个路由StudentController,里面有一个方法count().如果要在另外一个GradeController中调用count()方法有2种方式: 因为StudentControlle ...
- GMM实战
一道作业题: https://www.kaggle.com/c/speechlab-aug03 就是给你训练集,验证集,要求用GMM(混合高斯模型)预测 测试集的分类,这是个2分类的问题. $ hea ...
- windows + hadoop + eclipse 过程记录
昨天在本机上搭建了伪分布式的hadoop,今天决定在eclipse中搭建hadoop的环境,毕竟磨刀不误砍柴工 安装的hadoop是2.7.5版本,要想使用eclipse写MapReduce需要一个 ...
- [C] 错误笔记:函数调用——值传递
前提: 写一个函数,功能为在堆内开辟一块空间,并将首地址以函数参数的形式返回主调函数 错误demo void test(char *a) { ] = "hello"; printf ...
- 系统管理员常用的Linux命令
整理Linux的一些基本系统管理命令作为备忘 ========================================================================= 查看文 ...