内存管理范围:
管理任何继承NSObject的对象,基本数据类型不需要内存管理。
对象类型是程序运行过程中动态分配的,存储在堆区,内存管理主要是对堆区中的对象进行内存管理。
//-------------------- 概念
1)对象的所有权及引用计数
任何对象都可能拥有一个或多个所有者。只要一个对象至少还拥有一个所有者,它就会继续存在
任何自己创建的对象都归自己所有,以alloc,new,copy的方法创建对象,可以使用retain来获得一个对象的所有权
2)对象的引用计数器
每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。
3)引用计数器的作用
判断对象要不要回收的唯一依据
(存在一种例外:对象值为nil时,引用计数为0,但不回收空间)就是计数器是否为0,若不为0则存在。
//----------------------对引用计数器的操作 3个方法
给对象发送消息,进行相应的计数器操作。
retain消息:使计数器+1,该方法返回对象本身
release消息:使计数器-1(并不代表释放对象)
retainCount消息:获得对象当前的引用计数器值 %ld %tu
//--------------------------对象的销毁
当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
//1.对象销毁就执行dealloc方法
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。
//2.重写dealloc方法
一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
//3.对象销毁了存储空间不可用
一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指 针错误)。
注意:
1) 如果对象的计数器不为0,那么在整个程序运行过程,它占用的内存就不可能被回收(除非整个程序已经退出 )
2)任何一个对象, 刚生下来的时候, 引用计数器都为1。(对象一旦创建好,默认引用计数 器就是1 )
3)当使用alloc、new或者copy(mutablecopy)创建一个对象时,对象的引用计数器默认就是1 ;
#warning 开放如何使用:需要理解MRC,但实际使用时尽量用ARC
//----------------------如何管理ARC
target Build Settings Basic Leveis 搜索 auto --> NO
内存管理的关键是如何判断对象被回收
通过重写NSObject的dealloc方法:
代码规范:
(1)一定要[super dealloc],而且要放到最后,意义是:先释放子类占用的空间再释放父类占用的空间
(2)对self(当前)所拥有的的其他对象做一次release操作
-(void)dealloc
{
[_car release];
[super dealloc];
}
注意
永远不要直接通过对象调用dealloc方法(实际上调用并不会出错)
一旦对象被回收了, 它占用的内存就不再可用, 坚持使用会导致程序崩溃(野指针错误)为了防止调用出错,可以将“野指针”指向nil(0)。
dealloc方法,在对象销毁的时候会自动调用"临终遗言"
判断是否需要回收某个对象的内存:通过对象的引用计数器;retainCount
重写dealloc方法:一定要[super dealloc] ,而且要放到最后,意义是:先释放子类占用空间,在释放父类占用空间。这个方法是由系统调用,最好不要手动调用。
让引用计数变化:
retain : 引用计数加1;
release: 引用计数减1;
对象创建完成之后,它的引用计数是1;表示这个对象是可用的。
内存管理黄金法则:
如果对一个对象使用了alloc、[mutable]copy、retain,new, 那么你必须使用相应的release或者autorelease。
记住两点:
1,谁创建(alloc,new),谁release或者autorelease;
2,谁retain,mutableCopy(copy),谁release或autorelease;
总结
有始有终,有加就应该有减,曾经让某个对象计数器加 1,就应该让其在最后减 1;
|
|