标签:
OC的内存管理机制采用引用计数的方式来管理内存,分为三种方式,ARC(自动引用计数),MRC(手动引用计数),autorelease(自动释放池),ARC是iOS5之后引入的,是苹果公司为了减少开发者的工作量,降低程序崩溃,内存泄露的风险.
引用计数
关于引用计数,网上流传的开关灯例子不错,我们把房间的灯当做对象,开灯生成对象,照明需求持有对象,当房间人走完就无需照明,就得释放对象,而最后一步关灯即为废弃对象.
第一个开灯的人生成并持有了对象,其retainCount = 1;随后再进来的一人只需照明,也就是持有,需要对其retain一下,则retainCount就会加1,retainCount = 2;想要持有非自己生成的对象,就得retain,而当离开时,失去照明的需求,就得该对象失去了持有权,就对应得release一下,相应retainCount会减1,当最后一个人离开时,对应得不仅失去照明需求,还得关灯,同样得调用release方法,此时的retainCount将由1变为0,失去对象所有权的同时要把对象废弃掉,把内存还回去,当retainCount变为0时将会调用dealloc方法,最后总结下在OC的对象中存有引用计数这个整数值,调用alloc或retain方法后,引用计数就会加1,调用release后,引用计数减1,当计数值为0时,调用dealloc方法废弃对象,将内存还回去.
其中alloc/new/copy/mutableCopy都能生成并持有对象,而retain只能持有,同时不可变数组,可变数组,不可变字典,可变字典等的初始化方法(NSArray *arr = [NSArray array])只是取得了对象,但自己并不持有,所有不需用release,自己生成的对象被释放时,其实指向该对象的指针仍保留在变量中,但是绝对不可访问内存了.相当于是块无效地址了.
内存泄露:个人理解内存空间本身就像是块地,系统操作使用内存,内存就会给你分一小块地,自己去使用,但是你使用完要记得归还,如果不还,系统给别人就得分配别的地,别人用了也不还,久而久之,系统的所有地都被占用了,就发生内存泄露,导致程序崩溃
过度释放:顾名思义,对一个非自己持有的对象进行release了操作,会导致程序崩溃.
野指针: 指向一个已删除的对象或未申请访问受限内存区域的指针,通俗点说,相当于信封上的地址,但是通过这地址找不到房子,房子被拆了或找不着。
按道理释放完对象得置空指针,如:
Person *p = [Person alloc] init];
[p release]; // 释放堆的内存空间,引用计数变为0被回收
p = nil;
这里p本身是一个指针变量(4字节或8字节大 很小),在栈内存。栈内存的变量由系统自动释放回收,无需担心。
nil:指向oc中对象的空指针
Nil:指向oc中类的空指针
NULL:指向其他类型的空指针,如一个c类型的内存指针
NSNull:在集合对象中,表示空值的对象
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空
标签:
原文地址:http://www.cnblogs.com/forever54780/p/4865098.html