【问题标题】:Is it possible to add an object to a specific autorelease pool?是否可以将对象添加到特定的自动释放池?
【发布时间】:2009-04-28 19:59:00
【问题描述】:

在文档中有一个 addObject: NSAutoreleasePool 方法。

我想过这个:

NSString *myString = [[NSString alloc] initWithCString:"这行得通吗?"]; [thePool addObject:myString]; [anotherPool addObject:myString];

这可能吗?我总是读到我只能将对象添加到自动释放池堆栈的最顶层。

【问题讨论】:

  • 您似乎有很多与内存管理相关的问题。我认为仔细阅读内存管理编程指南 (developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/MemoryMgmt/…) 会对您大有裨益。您问题的所有答案都真实存在。祝你好运。
  • 我确实读了两遍。但不幸的是,我无法理解他们试图解释的方式。

标签: iphone cocoa-touch uikit autorelease


【解决方案1】:

是的,你可以。但你永远不应该。绝对没有理由这样做。

【讨论】:

    【解决方案2】:

    您正在做的事情是可能的,但可能会在运行时导致异常,因为 myString 将在解除分配后发送-release 消息(假设最后剩余的引用来自第一个池)。通常,正如-[NSAutoreleasePool addObject:] documentation 所述,您不应手动将对象添加到自动释放池中,而应在该对象上调用-autorelease。这会将对象放入当前线程的活动自动释放池中(每个线程都有自己的自动释放池)。

    【讨论】:

      【解决方案3】:

      我现在有点困惑,因为来自 Apple:

      当一个对象被自动释放时—— 是,当一个对象被发送一个 自动释放消息或当它是 作为参数传递给 addObject:类方法——它总是 放入顶部的自动释放池 堆栈的。

      另一方面,他们没有在 NSAutoreleasePool 类参考中提到它。所以我猜即使我在一个特定的对象上调用 addObject:,它也会进入自动释放池堆栈顶部的对象。其实我得试试看;)

      【讨论】:

      • 它说的是“类方法”,而不是实例方法。
      猜你喜欢
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多