【问题标题】:Objective-C Memory Management: Am I understanding this?Objective-C 内存管理:我理解这个吗?
【发布时间】:2013-03-25 17:49:39
【问题描述】:

我终于决定停止拐弯抹角,自学一些 Objective-C。这一切都是有道理的,除了当我谈到内存管理和“自动释放池”这个想法时。 据我了解,如果我专门使用 init、new、alloc 创建一个对象或告诉它保留,那么我的工作就是释放内存。但是,自动释放池会自动释放与最里面的自动释放池关联的所有对象吗? 例如,假设我这样做:

TestOBJ* foo = [[[TestOBJ alloc] innit] autorelease];

那么它会在第一个@autoreleasepool 块结束时释放,还是在第一个[autoreleasepool drain] 被调用时释放?

还有;仅仅因为一个对象是在 autoreleasepool 块中创建的,并不意味着它会自动标记为 autorelease,对吗?

【问题讨论】:

  • 小修正:你说“释放内存是我的工作”。 释放内存是你的工作。这是否会导致它被释放是一个单独的问题。

标签: objective-c nsautoreleasepool


【解决方案1】:

两点都正确。

只有在您调用 -autorelease 时,对象才会被添加到自动释放池中。按照惯例,所有以allocnewcopymutableCopy 开头的方法都会返回它们自己添加到自动释放池中的对象,因此您不必这样做自己。

详情请见http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

【讨论】:

  • 需要明确的是,框架通常会返回自动释放的对象。 IE。 NSMutableString *s = [NSMutableString stringWithFormat:@"..."]; 将返回一个自动释放的对象。
  • @CodaFi:一个constructor属性,但这根本不是它的作用。您正在考虑ns_returns_retainedns_returns_not_retained 的属性系列。
  • “按照惯例,所有不以 ... 开头的方法都返回它们自己添加到自动释放池中的对象” 不正确。它们只是返回您不拥有的对象。不能保证它们属于自动释放池。
  • @Chuck 我的天,我为什么要发布这个?我的意思是__attribute__((objc_method_family( init )))
  • @newacct 好点!我养成了始终确保返回的对象在自动释放池中的习惯,但是您可能会遇到不正确的情况(想到像 NSArrayNSDictionary 这样的容器类)。不过,ARC 的问题越来越小,因为局部变量无论如何都会强烈地捕获对象 :)
【解决方案2】:

您自己几乎正确回答了所有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多