内存管理(一)
在程序里,若运行过程中不但不能释放不在使用的内存反而会不停的分配内存这样占用的内存会越来越多,程序速度会越来越慢最后甚至会崩溃。
在指针所指向的对象已经被释放或回收的情况下,改指针被称为野指针或悬垂指针,继续使用这样的指针会造成程序崩溃。
OC中通过向类对象发送alloc消息来生成实例对象,alloc的作用就是分配内存,而它的返回值是id类型,因为id类型就是指针类型
OC中的内存管理
- 手动引用计数
- 自动引用计数(ARC automatic Reference Counting)
- 垃圾回收
手动引用
引用计数 每个对象都有一个与之相关的整数,称为引用计数,若需要使用对象则对象的计数器加1,当不使用的时候计数器减1.
- 当alloc和初始化方法创建一个对象的时候,该对象的引用计数的初始值为1,若需要持有一个实例的话需要给实例发送retain消息,每次retain消息之后引用计数器加1。
- 若不需要对象的时候发送release消息,引用计数减1,OC自动向对象发送一条dealloc消息来释放内存。(需要注意的是dealloc是实例方法而不是像alloc的类方法)。
需要用一个实例的话必须发送retain消息持有它,不然可能会异常。
(int)[obj retainCount]//方法返回的是NSUInteger需要类型转化获取当前计数的值
- (void)dealloc{//重写的是dealloc而不是release方法
/*
通过release方法释放子类中所有实例变量的所有权
*/
[super dealloc];//最后调用父类的收尾
}
自动释放
OC中有一种自动释放的机制,它的基本就是把要发送的release消息记录下来,需要释放对象的时候,给这些对象一起发release消息,而类NSAutoreleasePool(自动释放池)起到了记录的作用。
首先生成一个NSAutoreleasePool的实例对象,当一个对象发送autorelease消息的时候,就会将该对象添加到NSAutoreleasePool中,并标记以后释放
id pool = [[NSAutoreleasePool allloc]init];
/*
给临时对象发送autorelease消息
*/
[pool release] //销毁自动释放池,里面所有对象被销毁
注意的是在一个大型循环内会在开始的时候创建自动释放池来提高内存利用率,但是如果在中途通过continue或者break跳出的时候,会导致自动释放池没有释放。
常量对象
常量对象没有引用机制永远不会被释放