内存管理(简介,引用计数器)01

移动设备的内存及其有限,每个app所占的内存是有限制的

  

下列行为都会增加一个app的内存占用

1,创建一个OC对象

2,定义一个变量

3,调用一个函数或者方法

 

当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的空间。比如回收一些不需要使用的对象,变量等。

 

如果app占用内存过大:

系统可能会强制关闭app,造成闪退现象,影响用户体验。

 

所谓内存管理,就是对内存进行管理,涉及的操作有:

分配内存:比如创建一个对象,会增加内存占用

清楚内存:比如销毁一个对象,能减小内存占用

 

内存管理的管理范围

1,任何继承NSObject对象

2,对其他非对象类型无效(int,char,float,double,struct,enum等)

 

只有OC对象才需要进行内存管理的本质原因:

1,OC对象存放于堆里面。(里面内存动态回收的)

2,非OC对象一般放在栈里面(栈内存会被系统自动回收)

Car *car = [[Car alloc]init];

car为指针变量  再栈区,[Car alloc]  分配内存空间,在堆区分配空间

 

系统是如何判断什么时候需要回收一个对象所占用的内存?

根据对象的引用计数器。

什么是引用计数器?

每个OC对象都有自己的引用计数器。它是一个整数。

从字面上,可以理解为“对象被引用的次数”,也可以理解为:它表示有多少人正在用这个对象。

每个OC对象内部都有4个字节的存储空间来存放引用计数器。

 

当没有任何人使用这个对象时,系统才会回收这个对象,也就是说当对象的引用计数器为0时,对象占用的内存就会被系统回收。

任何一个对象,刚生下来的时候,引用计数器都为1.

当使用alloc,new或者copy创建一个对象时,对象的引用计数器默认就是1.

 

引用计数器的常见操作:

给对象发送一条retain消息,可以使用引用计数器+1(retain方法返回对象本身)

给对象发送一条release消息,可以使引用计数器值-1.

给对象发送retainCount消息,可以获得当前的引用计数器值。

 

需要注意的是:release并不是代表销毁\回收对象,仅仅是计数器-1.

 

当一个对象的引用计数器值为0时

这个对象即将被销毁,其占用的内存被系统回收

系统会自动给对象发送一条dealloc消息(因此,从dealloc方法有没有被调用,就可以判断出对象是否被销毁)

 

dealloc方法的重写

一般会重写dealloc方法,在这里释放相关资源,dealloc就是对象的一眼。

一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用

 

使用注意: 不能直接调用dealloc方法

一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)

 

ARC -----Automatic Reference Counting

在搜索中  写上Automatic r把yes改成no。

 

p指向的内存已经是坏内存,称person对象为僵尸对象

p称为野指针,指向僵尸对象(坏内存)的指针

 

posted @ 2015-10-09 21:41  知至  阅读(248)  评论(0编辑  收藏  举报