正常情况下打开Xcode新建工程的时候,默认的内存管理方式是自动的(ARC),需要在项目那里把内存管理方式调成非自动的。
这时,平常无法调用的基类的retain release方法就都可以使用了。
OC的手动内存管理流程
1.我们在创建对象的时候系统会自动给对象创建一个引用计数器(retainCount),初始化的值为1;retainCount是OC管理内存的唯一标准。
2.对象调用release方法可以使retainCount-1;
3.对象调用retain方法可以使retainCount+1;
4.当对象的retainCount==0的时候,系统会自动调用 当前类 继承自基类的dealloc方法,释放对象,回收内存空间。
release方法的推断内部实现,并没有让retainCount的值为0;
if(p.retainCount - 1 == 0){
[p dealloc];
}else
[p.retainCount]--;
内存管理针对的问题:
1.野指针
当指针指向一个不可访问的内存空间的时候,这个对象就叫做野指针;或者是当对象被销毁,指向这个对象的指针就变成了野指针。当对象被销毁,但是使用之前指向该对象的指针调用了对象的方法的时候,就会出现【EXC_BAD_ACCESS】异常。
当指针指向的对象被销毁后,把nil赋给指针,这样可以避免出异常。
BUT!!!如果多人开发,A不小心用了B创建并赋空的指针,那不是不报错也没有异常。找错都没法找....
2.内存泄露
当对象使用后没有被及时销毁,这时候就说是出现了内存泄露。
指针和对象的关系
别管怎么指针怎么调用,赋值,决定权就是指针中的地址,不要被搞晕了。
内存管理原则(配对原则)
程序中只要调用了 alloc new retain ,都要配对出现 release 或者 autorelease
retain多了,就会出现内存泄露;
release多了,就会出现空指针异常。
对@property声明的属性进行内存管理;
通过修饰符
assign 默认修饰符,控制property实现简单的set方法,直接赋值。适用范围,<基本数据类型,协议>
retain 控制property 实现复合类内存管理的set方法。旧值release,新值retain。
setCar{
[_car release];
_car = [car retain];
}