内存管理札记
1、引用计数
retain :将一个对象的reference数量增加1。
release:将一个对象的reference数量减少1。
autorelease:在未来某些时候将reference数量减少1.
alloc:为一个对象分配内存,并设置保留值数量(retain count)为1
copy:复制一个对象,并将其做为返回值。同时设置保留值数量(retain count)为1
2、uiviewcontroller生命周期
viewDidUnload :收到内存警告时自动调用除当前正在展示的 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 执行。这个是网上的材料没有说明的。