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程序员来说,内存管理是入门的 ...
随机推荐
- IOS使用批处理打包
一.注意 1.允许xcode访问钥匙串 首先使用xcode提供的打包工具打包,看到如下提示后,输入用户密码后点击“始终允许”后再次打包即可. 选择“Generic IOS Device”然后单击Pro ...
- YOLOv2训练自己的数据集(VOC格式)
下周试试,参考:http://blog.csdn.net/ch_liu23/article/details/53558549 http://blog.csdn.net/sinat_30071459/a ...
- WebStrom配置node.js
Webstrom的注册码: WebStorm 7.0.1注册码 user name:newasp 注册码: ===== LICENSE BEGIN ===== 16417-12042010 00001 ...
- 第四届CCF软件能力认证
1.图像旋转 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输 ...
- CSS------如何让div中的div处于右下角
如图: 代码: <div style="width:300px;height:300px"> <div style="position:absolute ...
- 深入分析Spring Boot2,解决 java.lang.ArrayStoreException异常
将某个项目从Spring Boot1升级Spring Boot2之后出现如下报错,查了很多不同的解决方法都没有解决: Spring boot2项目启动时遇到了异常: java.lang.ArraySt ...
- ArduinoYun教程之OpenWrt-Yun与CLI配置Arduino Yun
ArduinoYun教程之OpenWrt-Yun与CLI配置Arduino Yun OpenWrt-Yun OpenWrt-Yun是基于OpenWrt的一个Linux发行版.有所耳闻的读者应该听说他是 ...
- HDU3439 Sequence
今天下午学习了二项式反演,做了一道错排的题,开始了苦逼的经历. 显然答案是C(︀n,k)︀*H(n − k).其中H(i)为长度为i的错排序列 然后经过课件上一番二项式反演的推导 我就写了个扩展卢卡斯 ...
- [TC13761]Mutalisk
[TC13761]Mutalisk 题目大意: 有\(n(n\le20)\)个坏人,第\(i\)个坏人的血量为\(A_i(A_i\le60)\).你可以每次攻击\(3\)个坏人,并分别造成\(9\)点 ...
- COGS NIOP联赛 图论相关算法总结
最小生成树 Kruskal+ufs int ufs(int x) { return f[x] == x ? x : f[x] = ufs(f[x]); } int Kruskal() { int w ...