Autoreleasepool

概念

Autorelease pool 是OC的一种内存自动回收机制,用来回收临时变量和对象。自动释放池自身销毁时他中间的变量才会被销毁。之前的Xcode的自动释放池是半自动的,需要手动释放,但是新版Xcode不需要手动释放,释放了反而会报错。

使用

任何OC对象,只要调用autorelease方法,就会把该对象放到栈顶释放池中。就是如果我们只有一个释放池,我们将它放入栈中,这时候,我们再设一个释放池,就会放在离栈顶近的地方。这时,我们给对象开辟一段空间,它就会优先放在离栈顶近的释放池中。

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];


[pool release];

现在的Xcode中是这样的

@autoreleasepool{

}

这两种写法完全等价,关键字@aotureleasepool{等于NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
}等价于[pool release];

举例

假设我们创建了一个类Person,它有一个子类Dog,它们都有有基本的方法,有属性。我们来看两个例子,对比一下:(我们假设创建一个狗的对象dog,一个人的对象叫xiaoli,小丽有一个方法setDog,也就是可以遛狗,但是不能拥有这条狗)

Dog *dog1=[[Dog alloc]init];
[xiaoli setDog:dog1];
[dog1 release];

这段代码最后一句是没必要的,但是我们需要她说明点问题。在这段代码中,小丽拥有这条狗,所以我们释放dog1时,Dog的计数器会减为0。但是下面这段代码就不一样了

[xiaoli setDog:[[Dog alloc]init]];

在这里,我们创建Dog对象的时候计数器加一,小丽调用这条狗,计数器又加一,这个时候计数器为2.在调用完后我们释放小丽这个对象,计数器减1 。但是这时候计数器还是1 ,就是狗 还在。就会造成内存泄露问题。我们用aoturelease的时候也是可以的

Dog *dog1=[[Dog alloc]init]aoturelease];
[xiaoli setDog:dog1];

这个时候Dog就在自动释放池中,dog1这个指针只能指向它,并不能控制它。这个时候小丽再调用这个对象,还可以使计数器加1。这里不能【dog1 release】,因为dog1不能控制Dog开辟的内存。下面这种也是对的

[xiaoli setDog:[[Dog alloc]init]aotulease];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值