【问题标题】:Manual memory management explanation手动内存管理说明
【发布时间】:2014-07-29 08:18:14
【问题描述】:

我从Apple docs 得到这张图片:

对不起这个愚蠢的问题。有人可以解释一下这张图片吗?我的解释:

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

【问题讨论】:

  • 我相信图表是在谈论由 A 类创建并由 B 类和 C 类使用的单个对象。
  • 有道理。所以你说,我们创建 A,我们将 A 作为 iVar 添加到 B,然后我们复制 C 并将其添加到 B 实例(包含 A),然后我们向 A 发送释放方法 ....¿这是正确的?
  • 没有。 A 的实例创建对象 X。然后 B 的实例保留对象 X 的实例。然后 C 的实例复制对象 X。
  • 这很简单。任何名称以allocnewcopy 开头的方法都将返回一个保留计数为1 的对象。任何对retain 的调用都会将保留计数增加1release 会将保留计数减少1,并且autorelease 将在下次释放“当前”池时减少保留计数(通常在接下来主线程空闲)。所有其他方法对保留计数完全没有影响——如果它们创建一个对象,它将为 1,但自动释放为 0。如果保留计数达到0,则该对象可能会被销毁(不能保证。不要依赖它)
  • 对于 ivars,如果 @property 定义将其定义为 strongretain,则该值将在存储在属性中时保留,并在从属性中删除时释放。如果是 weakassignunsafe_unretained 则不会保留。如果一个属性只有set 方法但没有@property 定义,您需要查看文档,但通常它的行为与strong 相同。

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


【解决方案1】:

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

  • A 类的一个实例创建了一个新对象 - 它的保留计数为 1。
  • B 类的一个实例保留了新对象 - 它现在的保留计数为 2。
  • 类 C 的实例复制新对象 - 这是另一个新对象,保留计数为 1。
  • A 类的实例释放了新对象 - 它现在的保留计数为 1,因此不会被释放。
  • C 类释放它的副本 - 复制的实例被释放
  • B 类释放其对新对象的引用。引用计数归零并被释放。

【讨论】:

  • 我明白了。非常感谢详细的解释!我会等半个小时,我会接受你的回复。
  • 我已经更新了它,因为我认为 Matteo 的解释更有意义,尽管原则是一样的。
  • 太棒了! Thans jrthurton、matteo 和 erkanyildiz。现在解释清楚了!
【解决方案2】:

1) 我们创建一个 A 类 Object 的实例。FALSE

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

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

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

3) 在此之后,我们创建一个 ClassB 的实例并将他作为 iVar 添加到 Class A FALSE

ClassB的一个实例只保留了步骤1中创建的ClassZ的实例。而ClassZ的实例的retain count变为2。

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

在这里,谁创建了 ClassB 以及它目前保留的数量并不重要。它只是另一个声称对 ClassZ 实例拥有所有权的对象。

【讨论】:

    【解决方案3】:

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

    1- A 类的实例分配并初始化 X 类的对象 --> X retain count = 1;

    2- B 保留 X 类的实例。 B如何获得X并不重要,重要的是要拥有对象的所有权来维持它的存活 --> X retain count = 2;

    3- A release X --> X retain count = 1;

    4- B release X --> X retain count = 0; --> X 被释放

    第二部分只是说明复制一个对象,分配另一个对象,因此,这个新对象的相同机制对第一个对象没有影响强>。

    【讨论】:

    • 这可能比我的解释更有意义。 +1
    • 你确定吗?类 A 的实例不能创建 X 的实例。您的意思是“在 A 的方法中,我们使用 [[X alloc] init]; 创建类 X 的对象”; ?
    • 这就是我写的:A 创建并分配 X 的一个实例,不清楚吗?我写得更好
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 2013-10-25
    • 2011-05-14
    • 2014-04-10
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多