Coacoa内存管理

Coacoa内存管理

引用计数的概念

引用计数,就像办公室开灯关灯一样。本来灯是关着的,来了一个人就会把灯打开,然后在开关旁放一个小指示牌,并且做一个计数1。这是灯是开着的。当继续有人来的时候,就在指示牌上在加一个1,每来一个人指示牌上的计数就加1。当有人走的时候,就在指示牌上划掉一个计数。当最后一个人走的时候,发现只是牌上就一个计数的时候,把计数划掉,并且关灯。这样就不会出现有人的时候灯关了或者是没人了灯还开着的问题。  这就类似我们的内存分配一样,一块内存有指针指向的时候,就对它进行一个retain,不需要的时候就进行release,这样当所有的指针都不指向它的时候才可以销毁,避免了内存提前销毁导致的程序崩溃问题。

对象的持有

. 自己生成的对象自己持有,通过(alloc,new,copy,mutableCopy)都属于自己生成的对象。
. 不是自己生成的对象自己也能持有,比如 id array = [NSMutableArray array];这时候是取出来了对象,下面就该对他进行持有了 [array retain]; 对它retain操作 就是对他进行了持有。

对象的释放

. 自己不再需要对它进行持有时需要释放,自己通过alloc,new,copy,mutableCopy)创建的对象都需要自己进行释放
//自己生成并持有的对象
id obj = [[NSObject alloc] init];
//释放对象
[obj release];
//一般情况下,会在release只会,将对象指针赋为nil,避免指针悬空的情况
obj = nil;

. 取得不是自己生成的对象但是自己持有对象,不需要的时候仍然需要释放
//取得非自己生成的对象
id obj = [NSMutableArray array];
//自己持有对象
[obj retain];
//释放对象
[obj release];
obj = nil;

.非自己持有的对象无法释放
//自己生成并持有的对象
id obj = [[NSObject alloc] init];
//释放对象
[obj release];
obj = nil;
//释放之后再次释放已经不是自己持有的对象,应用程序会崩溃
[obj release];

.取得非自己生成的对象且自己不持有的对象不能释放
id object = [NSMutableArray array];
//如果这里释放非自己持有的对象,会导致应用程序崩溃
[obj release];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值