- 浏览: 623090 次
文章分类
最新评论
-
q781253433:
qin ~.求demo看看~
Android之Widget -
zhongyuanceshi:
博主,没看到你的例子的Demo,共享下
Android之Widget
原文章;http://www.cnblogs.com/pengyingh/articles/2342948.html
对于iphone开发人员来说,内存管理是极为重要的技巧,哪怕程序的功能再强大,设计再漂亮,如果内存控制不好,也难逃程序莫名退出的噩运,这与网页开发是完全不同的。
内存控制里面有很多门道,在这里分析一下 viewDidUnload 和 dealloc 的区别,关于这两者的区别的文章很多,但是大都是摘抄和翻译官方文档,有的也只是简单的说两句,并没有详细说出两者具体的区别。
在了解两者之间的区别,首先要知道 view 的生命周期,google 里面有很多文章,可以先去搜一下,这里就不详解了。
顾名思义 viewDidUnload 就是当 view 被卸载以后执行的语句,它与 viewDidLoad 是相互呼应的。大家都知道官方的解释是执行类似
self
.myOutlet =
nil
;
的命令,但是为什么这么干,什么时候调用这个方法呢?
这个方法是不能手动调用的,它实际上是当应用程序接收到手机内存警告的时候自动调用的方法,目的就是清空内存除当前 viewController 以外所有已经加载过的 viewController 里面的暂时不再使用的一些控件或数据,以避免应用程序应消耗内存过多被强制关闭。记住,是除当前正在展示的 view 所属 viewController 以外所有已经在内存里面的 viewController 执行 viewDidUnload 方法,而不是当前 viewController 执行 viewDidUnload,当然,这些 viewController 不会被 dealloc。所以在 viewDidUnload 里面一般都是释放 IBOutlet 变量和在 viewDidLoad、viewWillAppear、viewDidAppear 等方法能够重建的数据。而由其他页面传递过来的数据或者无法经过 viewDidLoad、viewWillAppear、viewDidAppear 等方法重建的数据则不能释放,举例子说如果在 navigationController 由上一个页面传递过来的一张图片,在 viewDidUnload 里被释放的话,则当 view 再次加载的时候就无法恢复了。
那为什么要写成 self.myOutlet = nil; ,实际上这个语法是执行了 property 里的setter 方法,而不是一个简单的变量赋值,它干了两件事:1、老数据 release 掉,2、新数据(nil)retain(当 property 设置为 retain 的情况下),当然对 nil retain 是无意义的。如果写成 myOutlet = nil,那就是简单的把 myOutlet 指向 nil,这样内存就泄漏了,因为老数据没有 release。而如果仅仅写成 [myOutlet release] 也会有问题,因为当 view 被 dealloc 的时候会 再次 release,程序就出错了,而对 nil release 是没有问题的。
dealloc 是当前 viewController 被释放的时候,清空所有当前 viewController 里面的实体和数据来释放内存,该方法也是自动调用的,无需手动执行。举例说明当 modalView 被 dismissModalViewControllerAnimated 或者 navigationController 回到上一页的时候,这个方法就会被自动调用。因为这个页面已经不再使用了,所以可以把所有实体和数据都释放(release)掉。
其实两者最大的区别就是: viewDidUnload 是内存除当前以外所有 viewController 同时执行,而 dealloc 只是当前 viewController 执行。这个是网上的材料没有说明的。
发表评论
-
tableview FPS 优化
2016-06-28 11:26 1现状: 在滚动tableview ... -
iOS 开发者中的公司账号与个人账号之间有什么区别?
2016-06-23 14:54 497原文:http://www.zhihu.com/questio ... -
strong weak copy
2016-04-24 21:01 628copy的使用 如果是mutable,则co ... -
App性能优化思考
2015-10-13 15:24 906一个app的数据 启动时间 crash率 每个 ... -
iOS之手势操作
2015-01-19 10:24 778手势学习: https://developer. ... -
iOS之网络学习
2015-01-19 10:23 640网络学习: http://nshipster.c ... -
nib文件的加载过程
2014-10-24 13:39 776参考:http://blog.csdn.net/nokiax ... -
NSCoder&&NSCoding使用
2014-10-24 11:38 755NScoder和NScoding的作用是将自定义的类的对象持 ... -
Autolayout学习
2014-10-20 16:32 742参考: http://my.oschina. ... -
IOS开发屏幕适配总结
2014-10-20 16:28 444面对4个分辨率的iPhone,建议使用Auto Layou ... -
Size Classes学习
2014-10-20 16:27 762Size Classes介绍:http://blog.su ... -
iPhone6分辨率以及适配
2014-10-20 11:36 1305对iPhone6适配的两种方式:1、兼容模式 这种模式 ... -
Core Animation简介
2014-10-19 15:33 776在iOS中,整个view都是直接构建在Core Animat ... -
Charles使用——HTTP代理服务器
2014-10-19 15:32 2050* HTTP代理服务器,监听8888端口 * HTTP监视 ... -
《精选》开发中遇到的问题总结
2014-10-19 15:31 10071、新浪微博的使用 使用的事umeng的SDK来调用微信、 ... -
使用JavaScript给UIWebView中的内容注入CSS
2014-10-06 21:26 1154NSString *filePath = [[NSB ... -
UIViewde的属性edgesForExtendedLayout
2014-09-26 17:56 692edgesForExtendedLayout 指定边缘 ... -
UIView的属性autoresizingMask
2014-09-26 17:36 762在 UIView 中有一个autoresizingMask ... -
UIWebView获取内容的高度
2014-09-24 13:13 740// 第一种方法 ... -
storyboard的总结
2014-09-02 11:30 732两个基本概念 scene 就是一个视图控制器 se ...
相关推荐
此外,如果视图控制器还持有其他对象的引用,你也需要在`dealloc`方法中释放它们,对于iOS 2.x,确保在调用`super dealloc`之前完成这一操作。 总结一下这三个方法的使用流程: 1. 视图需要时,系统会调用`loadView...
2. `self.name = "object"`与`name = "object"`的区别: `self.name = "object"`使用`self`调用实例方法,设置的是对象的成员变量`name`的值,而`name = "object"`直接赋值给局部变量`name`。 3. `retain count`:...
`viewDidUnload`和`dealloc`并不直接关联,即使视图已卸载,`dealloc`仍会继续释放其他非视图相关资源。 MVC(Model-View-Controller)是软件设计模式之一,广泛应用于Objective-C中的Cocoa框架。在Cocoa中,MVC...
3. Objective-C发送消息与C++成员方法或C的函数调用的区别在于动态绑定,即在运行时确定接收者和实现,而C++和C是在编译时确定。 4. 代码问题:缺少autorelease,可能导致内存泄漏。正确版本:`return [[[NSNumber ...
1. `alloc`与`dealloc`、`retain`与`release`的关系:`alloc`是创建对象并分配内存,`dealloc`用于释放对象内存,而`retain`增加对象的引用计数(`retain count`),`release`减少引用计数。与`alloc`配对使用的是`...
`viewDidLoad`, `viewWillAppear`, `viewDidUnload`, `dealloc`等方法在不同的生命周期阶段被调用。例如,`viewDidLoad`在视图加载完成后调用,适合进行初始化设置;`dealloc`在对象被销毁前调用,应在此释放资源。 ...
3. `viewDidUnload`与`viewDidLoad`相对应,它是视图控制器在内存紧张时释放视图的入口点。开发者应当在这个方法中释放视图及其子视图,放弃对它们的引用,以帮助iOS系统回收内存。需要注意的是,不应在这个方法中...
Objective-C与Swift的区别 - **Objective-C**:基于消息传递的编程模型,使用点语法调用方法。 - **Swift**:采用更现代的语言特性,如类型推断、模式匹配等,同时兼容Objective-C代码。 ### 6. 导入头文件 - **...
在`viewDidUnload`或`dealloc`方法中,苹果推荐先将对象设为`nil`,然后再释放,因为这可以确保即使在对象被释放后,仍无法通过该指针访问它,从而避免意外的内存访问。 总结来说,`nil`用于Objective-C对象,`NULL...
- `viewDidUnload`:内存不足时,视图被卸载,不再调用。 - `dealloc`:视图控制器被释放前调用,释放资源。 9. **Objective-C内存管理** Objective-C使用引用计数来管理内存,`retain`、`release`、`...