我们 来概括一下 关于内存管理 我们所学到的东西:
- 对物件 采取 release这项措施 可以使 这个物件 从内存中 被清理掉,如果 你 在程序执行的过程中 创建 大量的物件,你 就应该关心 这点。
- 对物件 采取 release这项措施 并不必然将 物件 从内存中 清理掉。只有 在物件的引用次数 降至 0时,物件 才会被 从内存中 清理掉。当物件的引用次数 降至 0时,系统 会对这个物件 采取 dealloc这项措施,从而 将 其 清理掉。
- 当自动释放池 被清理时,自动释放池中的物件 也会被清理。对物件 每采取 一次autorelease这项措施,清理 自动释放池时 系统 就会对池子中的物件 采取 一次release这项措施。
- 在一项措施的实施过程中 如果 你 不再需要 某个物件,而 你 却需要将 这个物件 作为结果 传递回去,那么 你 可以对这个物件 采取 autorelease这项措施,将 其 添加 到自动释放池。autorelease这项措施 并不会改变 物件的引用次数。但是 对 物件 采取 autorelease这项措施后,清理 自动释放池时,系统 就会对这个物件 采取 release这项措施。
- 当程序 中止的时候,内存中的所有物件 都会被清理掉,不管 他们 是不是 在自动释放池当中。
- 当你 开发 更加复杂的程序时,比如 cocoa应用程序,自动释放池 在程序执行的过程中 可以创建 也可以清理掉。如果 你 希望 自动释放池 被清理的时候,其中 某些物件 保留下来,你 应该对这些物件 采取 retain这项措施,以增加 其引用次数。任何物件 如果 其引用次数 大于 对其采取autorelease这项措施的次数,那么 在清理 自动释放池时,这样的物件 就会被保留下来。
- 如果 你 直接 采取 new、alloc、copy、allocWithZone:、copyWithZone: 或者 mutableCopy这些措施 创建 物件,那么 将 这些物件的引用次数 降至 0 就成为 你的责任了。每当你 采取 retain这项措施 增加 物件的引用次数,那么 相应地 你 就应该采取 release 或者 autorelease 手动地 或者 自动地 减少 物件的引用次数。
- 如果 某些物件 是 某些措施 作为结果 传递给你的,你 就不用担心 如何清理 他们。因为 这些措施当中 已经对这些物件 采取了 autorelease这项措施。这 就是 为什么 在程序当中 第一件事 就是 创建 自动释放池。像 stringWithString:这样的措施 就会对它产生的字符串物件 采取 autorelease这项措施,从而 将 其 添加 到自动释放池。如果 你 没有创建 自动释放池,那么 你 就会被告知 你 试图 在没有 自动释放池的情况下 对物件 采取 autorelease这项措施。