【发布时间】:2014-07-29 08:18:14
【问题描述】:
我从Apple docs 得到这张图片:
对不起这个愚蠢的问题。有人可以解释一下这张图片吗?我的解释:
- 我们创建一个 A 类 Object 的实例。
- 在 [[ClassA alloc]init] 之后,对象的保留计数为 1。
- 之后,我们创建一个 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。
-
这很简单。任何名称以
alloc或new或copy开头的方法都将返回一个保留计数为1的对象。任何对retain的调用都会将保留计数增加1,release会将保留计数减少1,并且autorelease将在下次释放“当前”池时减少保留计数(通常在接下来主线程空闲)。所有其他方法对保留计数完全没有影响——如果它们创建一个对象,它将为 1,但自动释放为 0。如果保留计数达到0,则该对象可能会被销毁(不能保证。不要依赖它) -
对于 ivars,如果
@property定义将其定义为strong或retain,则该值将在存储在属性中时保留,并在从属性中删除时释放。如果是weak或assign或unsafe_unretained则不会保留。如果一个属性只有set方法但没有@property定义,您需要查看文档,但通常它的行为与strong相同。
标签: ios cocoa-touch memory-management reference-counting