【问题标题】:How to know if an object is autoreleased or not?如何知道一个对象是否被自动释放?
【发布时间】:2010-11-30 19:10:21
【问题描述】:

有些对象在我不知情的情况下被自动释放,这让我有点恼火。他们可能是一件好事,但如果他们是,我想知道。文档没有说明哪些方法可以自动释放对象,所以我通常会测试我的前进方式,在我看来这很愚蠢。例如,[NSDate date] 自动释放对象,[NSArray arrayWithObjects:...] 也是如此。没有文档告诉你怎么知道?

我开始看到一种模式,尽管像这样的方法,使用静态函数创建对象的方法,总是返回自动释放的对象。总是这样吗?

【问题讨论】:

  • 我相信你的意思是“类方法”(而不是“实例方法”)而不是“静态函数”。正如下面所回答的,+/- 不能确定返回的对象是否是自动释放的,这是一个约定和简单规则的问题。大多数方法返回您必须保留的对象 - 返回具有 +1 保留计数的对象的方法是例外而不是规则。
  • 我的意思确实是类方法。我使用了 java 术语中的“静态”,出于某种原因使用了“函数”,尽管它应该是“方法”。好吧,无论如何,它们在记忆中都是一样的。 :)

标签: objective-c autorelease


【解决方案1】:

基本上,如果您 initcopyretain 一个对象,您有责任释放它。如果你不这样做,你不负责发布它。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

许多类都提供了 形成 +className... 你可以用来 获取该类的新实例。 通常被称为“便利 构造函数”,这些方法创建一个 类的新实例,初始化 并返回给您使用。 虽然你可能认为你是 负责释放对象 以这种方式创建,这不是 根据所有权的情况 早先制定的政策。因为 类创建新对象,它是 负责处理新的 对象。

【讨论】:

    【解决方案2】:

    方法签名本身告诉你。具有“classNameWithData:data1:data2”等签名的方法的模式是返回该事物的 alloc/init/autorelease 实例。它们在那里很方便,因此您不必这样做。

    如果你不想要某个东西的自动释放版本,那么不要以这种方式实例化它们,并使用正确的 alloc/init,并在完成后释放。这种方法更加明确,也更容易出错,因为如果抛出异常,您的发布块可能会丢失,但这是您为此付出的代价。

    【讨论】:

    • +1。如果你没有使用 alloc/init 来获取一个对象,假设它是自动释放的并适当地处理它。
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 2021-09-29
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多