使用没有NSAutoReleasePool的autoReleased对象?

Pet*_*uza 1 macos xcode cocoa objective-c

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

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

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

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

Alf*_*nso 6

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

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

  • 它是应用程序对象,它为每个事件创建和排出自动释放池,而不是运行循环.如果您只创建一个运行循环而不是一个应用程序对象,您仍然需要创建并排空自己的池. (2认同)