使用没有NSAutoReleasePool的autoReleased对象?

时间:2011-06-22 22:01:59

标签: objective-c xcode cocoa macos

我正在写Objective-C的第一步 我按照一些示例和官方文档,并使用自动释放的对象*,而没有明确声明NSAutoReleasePool。

*通过自动释放的对象,我的意思是:SomeClass *obj = [SomeClass someClass];

这样做可以吗?
它会导致记忆问题吗? 宣布NSAutoReleasePool更有效率吗?

编辑:我在代码示例中犯了一个错误,我的意思是通过它的类工厂方法获取一个对象,而不是alloc它的一个实例。这个工厂方法[经常|总是]返回自动释放的对象,对吧?例如:[NSString stringWithCString:x]

2 个答案:

答案 0 :(得分:6)

您通常不需要显式创建自动释放池。当您使用AppKit框架进行正常的Mac编程时,会有一个由事件循环处理的隐式自动释放池。您需要关注自动释放池主要有两种情况:

  • 您的代码在后台线程中运行:如果您有后台线程,则没有为您创建自动释放池,您必须手动执行此操作。
  • 你有一个紧凑的循环,你创建和销毁很多对象。如果在此循环中任何对象都是自动释放的,则在自动释放池耗尽之前,它们实际上不会被释放。这意味着即使您不再引用这些对象,您的内存消耗也会增加。在这种情况下,具有本地自动释放池可以帮助提高性能,尽管从自动释放切换到显式保留/释放可能更有效。

答案 1 :(得分:1)

回答你的问题:这是禁忌。如果在没有自动释放池的作用域中自动释放对象(或使用自动释放的对象),则会泄漏内存。

或许忽略以下内容:

关于您的示例,由于Classstruct objc_class*的typedef,因此您编写它的方式可能会相当混乱。所以,你真的声明了一个指向类的指针,然后为它指定一个类的指针。哪个不行。此外,由于Class本身不是Objective-C“类型”,因此您无法向其发送消息。 但是这一切既不在这里也不在那里,因为±class不会返回一个自动释放的对象。