手动内存管理说明

时间:2014-06-08 18:16:22

标签: ios cocoa-touch memory-management reference-counting

我从Apple docs获得了这张图片: enter image description here

抱歉这个愚蠢的问题。有人可以解释一下这张图片吗?我的解释是:

  1. 我们创建一个A类对象的实例。
  2. 在[[ClassA alloc] init]之后,对象的保留计数为1.
  3. 在此之后,我们创建了一个ClassB实例并将其作为iVar添加到A类中 - 它是正确的吗?实例化意味着保留计数为1,所有权关系(现在A拥有B)意味着保留计数的增量为1。 (1 + 1 = 2)现在B的保留计数为2.¿是正确的吗? Anynone?

3 个答案:

答案 0 :(得分:1)

您误解了图表。从左到右:

  • A类的实例创建一个新对象 - 它的保留计数为1。
  • B类实例保留新对象 - 现在它的保留计数为2.
  • C类的实例制作新对象的副本 - 这是另一个新对象,保留计数为1。
  • A类实例释放新对象 - 它现在的保留计数为1,因此不会被释放。
  • C类释放其副本 - 复制的实例已取消分配
  • B类释放对新对象的引用。引用计数返回到零并且已取消分配。

答案 1 :(得分:1)

1)我们创建了一个A类对象的实例。FALSE

ClassA创建了另一个类的实例,让它们称之为ClassZ。

2)在[[ClassA alloc] init]之后,对象的保留计数为1. FALSE

它不是[[ClassA alloc] init],它是[[ClassZ alloc] init]。现在,ClassZ的实例保留计数为1。

3)在此之后,我们创建一个ClassB实例,并将他作为iVar FALSE

添加到A类

ClassB的一个实例只保留在步骤1中创建的ClassZ实例.ClassZ实例的保留计数变为2.

4)实例化意味着保留计数为1,所有权关系(现在A拥有B)意味着保留计数的增量为1。 (1 + 1 = 2)现在B的保留计数为2. FALSE

目前创建ClassB及其保留计数的重要性并不重要。它只是声称对ClassZ实例拥有所有权的另一个对象。

答案 2 :(得分:1)

所以, 真的很简单,按照这一点解释主线:

1-类的实例 A分配并初始化类X的对象 - > X保留计数= 1 ;

2-类 B保留X 的实例。 B如何获得X并不重要。重要的是希望拥有对象的所有权以维持它 - > X保留计数= 2 ;

3- 版本X - > X保留计数= 1;

4- B释放X - > X保留计数= 0 ; - > X已取消分配

第二部分只是解释复制一个对象,另一个对象被分配,因此,这个新对象上的相同机制对第一个对象没有影响