酒鬼 2012-10-15
在ios5之前,是没有ARC的,所以内存靠自己手动回收或者使用autorelease.下面来介绍非ARC的情况,假定有两个指针a和b.
1.关键字asign。针对的情况就是直接赋值,只针对基本类型,比如int float double short bool char long等。它只进行直接赋值,不进行引用计数,所以也不用管理内存。
2.关键字retain。假定指针a指向了一块内存区域,我们又将b指向了这块内存,这时候我们假定指针a不再使用,我们是否可以释放掉这块内存?答案是很明显的。不能!因为b还 在使用这块内存,如果释放,就会crash掉。所以引入了引用计数功能。retain就是计数+1,当我们对属性设定了retain关键字时,alloc init就会对内存计数+1
3.关键字release.release和第二条刚好相反,进行引用技术-1操作。当引用技术为0时,dealloc会被调用,内存被回收。如果指针a指向了两块内存,那么就应该调用两次release。
4.关键字copy。copy的意思就是复制了两块内存。
5.关键字atomic。此属性只支持同步操作,也就是线程安全的。
6.关键字nonatomic。支持异步操作,非线程安全。
7.关键字autorelease。如果a指向的对象是autorelease的,那么我们将不用对a进行release操作。当a不再使用时,a将进入NSAutoReleasePool. a的生命周期将会被延长,当pool drain的时候,a才会被销毁。应用启动的时候会初始化一个NSAutoReleasePool.在main函数里。
8.NSAutoReleasePool介绍。
初始化的方法为:NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];
释放的方法非release而是[subPool drain];
以下英文摘自苹果官方文档。
In a garbage collected environment, release is a no-op. NSAutoreleasePool therefore provides a drain method that in a reference-counted environment behaves the same as calling release, but which in a garbage collected environment triggers garbage collection (if the memory allocated since the last collection is greater than the current threshold). Typically, therefore, you should use drain rather than release to dispose of an autorelease pool.
使用场景:1.当我们使用autorelease管理的内存过大时,应自己初始化一个pool并执行回收,因为pool管理的内存回收的时间是不确定的。 2.当我们新起一个线程的时候,如果我们用到了autorelease,我们应当自己初始化一个pool,因为主线程是不管理新起线程的autorelease的。