OC的手动内存管理

正常情况下打开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];

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值