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。

使用注意

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

<<:  DNS over TLS (DoT)

>>:  [Python]Login, Search, Download

Gulp 释出你的开发成品 DAY90

这里先来介绍两个套件 gulp-clean 与 gulp-sequence https://www....

D-8. Rails 用Postman测试自己的WEB API && Valid Parentheses

请先安装Postman 今天完成整个CRUD,简单介绍操作Postman。 接续昨天文章 9.修改r...

LeetCode 双刀流:206. Reverse Linked List

206. Reverse Linked List 这是一个「链结串列(Linked List)」的...

.Net Core Web Api_笔记13_api结合ADO.NET资料库操作part1_专案前置准备到资料新增

专案前置准备 新建好资料库以及资料表 create table NewsType ( NewsTyp...

【学习笔记-JS】处理阵列的方法

接下来介绍处理阵列的方法 这些方法对於资料处理很重要 那就一起来看下去吧 处理阵列的方法 .forE...