iOS APP 开发 OC 第二十天,自动释放池

tags: OC 30 day

自动释放池的原理

存入到自动释放池中的对象,在自动释放池被销毁的时候,会自动调用储存在该自动释放池中的所有对象的release方法。

可以解决的问题:
将创建得对象,储存在自动释放池当中。就不再需要手动release这个对象了。
因为池子销毁的时候,就会自动调用池中所有对想的release。

如何创建自动释放池

    @autoreleasepool {    }

这对大括弧代表这个自动释放池的範围。

如何将对象储存在自动释放池之中

在自动释放池中调用对象的autorelease方法,就会将这个对象存入到当前自动释放池之中。这个autorelease方法返回的是对象本身。所以我们可以这么写

    @autoreleasepool {        Person *p1 = [[[Person alloc]init]autorelease];    }

可读性比较高的写法

    @autoreleasepool {        Person *p1 = [[Person alloc]init];        [p1 autorelease];    }

这个时候,当这个自动释放池执行完毕之后,就会立即为这个自动释放池的对象发送一条release消息。

目前为止,我们感受到的autorelease的好处:

创建对象,调用对象的autorelease方法,将这个对象存入到当前的自动释放池当中。

我们就不需要再去release,因为自动释放池销毁的时候,就会自动的调用池中所有对象的release。

使用注意

只有在自动释放池当中调用了对象的autorelease方法,这个对象才会被储存到这个自动释放池当中。如果只是将对象的创建代码写在自动释放池当中,而没有调用对象的autorelease方法,是不会将这个对象储存到这个自动释放池当中的。对象的创建可以在自动释放池外面,在自动释放池之中调用autorelease方法,就可以将这个对象储存到这个自动释放池里面。如果对象的autorelease方法的调用放在自动释放池外面,是无法将其储存的这个自动释放池当中的。autorelease 的调用只有放在自动释放池当中,才可以将其存备道自动释放池当中,对象的创建可以在外面。当自动释放池结束的时候,仅仅是对存备在自动释放池中的对象发送一条release消息,而不是销毁对象。如果在释放池当中,调用同一个对象的autorelease方法多次,就会将对象储存多次到自动释放池当中。在自动释放池结束之后,会为对象发送多条release消息。所以,一个自动释放池之中,只autorelease 一次,只将这个对象放一次,否则会出现 wildpointer错误。如果在自动释放池中,调用了储存到自动释放中的对象的release方法。在自动释放池结束的时候,还会再调用对象的release方法。在自动释放池结束的时候,还会再调用release方法。这个时候就有可能造成wildpointer操作。将对象储存到自动释放池,并不会使对象的引用计数器+1。所以其好处就是:创建对象将对象储存在自动释放池,就不需要再写release了。自动释放池可以嵌套。调用对象的autorelease方法,会将对象加入到当前自动释放池之中,只有在当前自动释放池结束的时候才会向对象发送release消息。

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章