【问题标题】:Retain Count on alloc and init在 alloc 和 init 上保留计数
【发布时间】:2013-03-22 23:46:43
【问题描述】:

一些网站这样说:

@property (nonatomic, strong) MyObject *foo;

self.foo = [[MyObject alloc] init];

将保留计数增加到 2

但由于最新的 xcode 版本或 ARC,这应该不是问题吧?

根据视频我们可以取出所有的自动释放

因此:

@property (nonatomic, strong) MyObject *foo;

self.foo = [[[MyObject alloc] init] autorelease];

变成这个

@property (nonatomic, strong) MyObject *foo;

self.foo = [[MyObject alloc] init];

所以我应该忽略那个说self.foo = [[MyObject alloc] init]; 将保留计数增加到 2 的网站吗?

【问题讨论】:

  • 对于 ARC,它不允许使用自动释放。所以即使你把它放进去,它也会告诉你删除它。

标签: ios objective-c cocoa-touch automatic-ref-counting


【解决方案1】:

如果没有 ARC,您可能应该使用retain(以及相应的assign)而不是strong(和weak)。在您的第一个示例中,没有 ARC,- init 方法返回一个保留计数为 1 的对象,foo 属性的设置器将保留计数增加到 2。

在您的第二个示例中(必须没有 ARC,因为 autorelease 不适用于 ARC),- autorelease 调用将对象添加到自动释放池并将其保留计数减少 1,因此对象结束保留计数为 1(对于属性)。

使用 ARC,就像在您的第三个示例中一样,您根本不需要担心保留计数 — 这就是 ARC 的意义所在。在幕后,- init 仍应返回保留计数为 1 的对象,foo 的设置器仍应增加保留计数,但编译器应在调用设置器后的某处插入- release。基本上,使用 ARC,因为属性是 strong,所以一旦将其分配给属性,您就可以依赖对象继续存在,而不必考虑 retain/release/@ 987654336@.

【讨论】:

  • 你是说使用弧,@property (nonatomic, strong) MyObject *foo; self.foo = [[MyObject alloc] init];会将保留计数增加 2,但最终会使保留计数变为 0?
  • 首先,重要的一点:如果您使用 ARC,则根本不应该考虑保留计数;一个强大的属性将确保它所指向的任何东西继续存在。我期望实现是什么(尽管我没有检查编译的输出来验证)是该对象在 init 调用之后但在分配给属性之前的保留计数为 1,在分配给后保留计数为 2属性,然后编译器插入一条释放语句将保留计数减回到 1——此时,属性应该是唯一保留对象的东西。
  • @Ben 这意味着编译器确定该对象的生命周期并插入必要的调用retainreleaseautorelease。但是像您一样了解内存管理的工作原理是一个好主意。这个答案有一些很好的背景:stackoverflow.com/a/6418410/620197
【解决方案2】:

ARC 使这种说法不真实。自动释放并没有消失,它只是现在被编译器插入,你看不到它。

【讨论】:

  • 编译器是否在正确的位置插入了autorelease 或实际的release
  • @Isaac 这是一个实现细节。有什么关系?我们关心的是编译器不会不必要地泄漏内存。
  • @CodaFi:在大多数情况下,是的,但值得知道是否正在使用自动释放池,因为在某些情况下,出于性能原因,人们会专门使用备用自动释放池和/或耗尽特定点的水池。此外,它可以在对象消失时发生变化。
  • @Isaac 存储限定符的重点是消除大部分担心的需要。内存管理及其性能现在是编译器的工作,我们对它的工作原理几乎没有发言权(没有回到 MRC)。
  • @CodaFi:总的来说,我同意;但是,如果编译器在它认为是变量的最后一次使用之后立即插入 release(与 autorelease 相对),如果该变量指向的对象,了解调试目的是有用的应该继续存在于代码块的其余部分,但被神秘地释放了。
猜你喜欢
  • 1970-01-01
  • 2015-06-17
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多