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,码迷,mamicode.com

时间: 2024-10-10 06:55:17

iOS 内存斗争小史之 NavigationController的相关文章

IOS 内存斗争小史之 对象、指针、内存的基本理解

1.指针和对象,都是内存块.一个大,一个小.一个在栈中,一个在堆中. 2.iOS中,我们可以生命一个指针,也可以通过alloc获取一块内存. 3.我们可以直接消灭掉一个指针,将其置为nil.但是我们没办法直接消灭一块对象内存.对于对象内存,我们永远只能依靠系统去回收.而什么时候回收,就需要使用苹果为我们提供了"对象所有权"机制.当一个对象没有被任何指针拥有时,这块对象内存将被系统回收.如果,这个对象是你自定义的,需要自己实现dealloc方法.告诉系统你想怎么回收. 4.将一个指针置为

iOS内存管理小谈

内存管理管理的是哪的内存?其实我们要管理的就是堆区的内存空间和任何继承NSObject的对象 1.首先要明确的一点是内存总共分为五大区,分别是栈区,堆区,BSS段,数据区和代码区: 2.BSS段,数据区和代码区这三大区是随着程序的启动加载到内存空间的,我们熟知的全局变量就存储在这里,不过分为两种情况:如果是未初始化的全局变量,那么它存储在BSS段,如果是初始化的全局变量的话就存储在数据区:很多时候我们不推荐大家创建全局变量的原因就是因为如果一个程序启动的话,存储在这里的全局变量就会随着程序的启动

iOS 知识-常用小技巧大杂烩

iOS 知识-常用小技巧大杂烩 1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图显示到屏幕上了,点击按钮 * 添加子视图也会调用这个方法 * 当本视图的大小发生改变的时候是会调用的 * 当子视图的frame发生改变的时候是会调用的 * 当删除子视图的时候是会调用的 3,NSString过滤特殊字符 // 定义一个特殊字符的集合 NSCharact

IOS内存管理

原文链接:http://blog.csdn.net/weiqubo/article/details/7376189 1.  内总管理原则(引用计数)    IOS的对象都继承于NSObject,   该对象有一个方法:retainCount ,内存引用计数. 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样.       (一般情况下: 后面会讨论例外情况)    alloc      对象分配后引用计数为1    retain    对象的引用计数+1

【iOS开发每日小笔记(五)】实测copy到底是个神马玩意

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

iOS内存管理和malloc源码解读

0. iOS内存基本原理 在接触iOS开发的时候,我们都知道“引用计数”的概念,也知道ARC和MRR,但其实这仅仅是对堆内存上对象的内存管理.用WWDC某Session里的话说,这其实只是内存管理的冰山一角. 在内存管理方面,其实iOS和其它操作系统总体上来说是大同小异的,大的框架原理基本相似,小的细节有所创新和不同. 和其它操作系统上运行的进程类似,iOS App进程的地址空间也分为代码区.数据区.栈区和堆区等.进程开始时,会把mach-o文件中的各部分,按需加载到内存当中. 而对于一般的iP

【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸的笑.没办法,老老实实修复bug! 来看看今天我遇到的一个问题: 项目中,我将一个简化的H

【iOS开发每日小笔记(四)】iOS 7中如何除去UIAlertView 规避delegate对象销毁后接收消息的crash

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在本文的评论

转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber

http://www.bubuko.com/infodetail-382485.html 这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下.90%的作用是帮助自己回顾.记忆.复习. 测试组的小伙伴们大显神威,iOS8刚发布,他们就把测试设备急速升级了,然后就是扑面而来的各种bug和他们各种幸灾乐祸