移动设备的内存及其有限,每个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称为野指针,指向僵尸对象(坏内存)的指针