OC中的内存管理主要由三种方式ARC(自动内存计数),手动内存计数,内存池;
1)ARC:这种方式和java类似,在你的程序的执行中,始终有一个高人在你背后准确的帮你收拾垃圾,你不用考虑它什么时候开始工作,怎么样工作,你只需明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就会彻底把它忘掉了,反正那个高人会帮我们收拾垃圾的,但遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品,所以iPhone不支持这个功能。
解决:通过alloc-inital方式创建的,创建后引用计数器+1,此后每retain一次引用计数器+1,那么在程序中做相应的次数release就好了。
2)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存被使用的次数,我们暂时把它称为计数器。当计数器变为0的时候,那么就是释放这段内存的时候,比如说,在程序A中一段内存被成功申请完成之后,那么这个计数器就从0变为1(我们称为这个过程为alloc),然后程序B也需要这个内存,那么计数器就从1变为2(我们把这个过程叫做retain)紧接着程序A不再需要这个内存了,那么这个计数器就会减1(我们叫这个过程为release),程序B也不需要这个内存的时候,那么也把计数器减去1(这个过程也叫release)当系统(也就是Foundation)发现这个计数器成员变为0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手动完成。
解决:一般由类的静态方法创建的,函数名中不会出现alloc或init字样,如[NSString string]和[NSArray arrayWithObject:],创建后引用计数+0;在函数出栈后释放,即相当于一个栈上的局部变量,当然也可以通过retain延长对象的生存期。
3)内存池:可以通过创建和释放内存池控制内存申请和回收的时机。
解决:是由autorelease计入系统内存池,内存池是可以嵌套的,每个内存池都需要有一个创建释放对象,就像main函数中写的一样,使用也很简单,如果[[[NSString alloc]initwithFormant:@"Hey you!"] autorelease],即将一个NSString对象加入到最内层的系统内存池,当我们释放这个内存池时,其中的对象都会被释放。