【问题标题】:Proper Usage of @autoreleasepool正确使用@autoreleasepool
【发布时间】:2016-05-24 05:27:21
【问题描述】:

我在我的代码中混合了一些 ObjectiveC 和 C++。 (我的文件是.mm 文件而不是.m。)什么时候是用@autoreleasepool 包装任何代码块的正确理由?不知道我在做什么,我正在包装任何可能包含任何非 ObjectiveC 变量的代码块,无论是 intcharstd::string,还是非 ObjectiveC 变量的任何指针.因此,我的 C++ 类中的每个类方法都有一个 @autoreleasepool 包装器。

我做错了吗?

请注意,在与此问题相关的先前问题中,他们谈到了使用 alloc、init 和 release,而这些现在在 XCode7+ 中似乎已被弃用。所以,我需要这方面的最新建议,而不是旧建议。我需要有关 XCode7 或更高版本的建议。

【问题讨论】:

  • 您不必将调用包装在@autoreleasepool 中——每个线程都会自动创建一个。如果你在一个不是主线程的线程上,你可能需要创建一个自动释放池。
  • 无论如何,如果您在没有自动释放池的情况下尝试自动释放对象,您将在控制台中收到打印警告
  • 为什么,当我创建一个控制台应用程序时,它会默认在它创建的 main.m 中添加@autoreleasepool 块,然后呢?
  • 我认为机器是通过调用 NSApplicationMain() 来设置的。在应用程序中,您的事件、标注、计时器等都是从 AppKit 运行时调用的,它每次都会设置一个自动释放循环。

标签: c++ objective-c memory-management xcode7 nsautoreleasepool


【解决方案1】:

自动释放池用于限制 autoreleased 中的事物的生命周期。 autorelease 是一个 Cocoa Objective-C API,所以只有 Objective-C 代码可以autorelease 的东西。因此,将自动释放池放置在您确定不会调用到 Objective-C 代码中的纯 C/C++ 代码块周围是没有任何意义的。

自动释放池通常仅适用于循环运行多次且每次迭代可能执行大量autorelease 的情况。请注意,并非所有 Objective-C 代码都会autorelease;这并不明显。一些 Cocoa API 将 autorelease 和一些不会。如果都是你自己用 ARC 写的代码,那可能不会autorelease

【讨论】:

  • 好的,如果我有一个 C++ 函数,我什么时候需要释放这些变量?我只是害怕从其他程序员那里听到的内存泄漏,甚至不知道如何检测这些。
  • @Volomike:“释放这些变量”是什么意思? retain/release 是用于 Objective-C 对象的 Cocoa API。你不能retain/release 其他任何东西。
【解决方案2】:

如果您使用的是 AppKit,则不必创建自动释放池:

Application Kit 在主线程上创建一个自动释放池 事件循环的每个周期的开始,并在 结束,从而释放同时生成的任何自动释放对象 处理一个事件。如果您使用应用程序工具包,您将因此 通常不必创建自己的池。如果您的应用程序 在事件循环中创建大量临时自动释放对象, 但是,创建“本地”自动释放池以 有助于最小化峰值内存占用。

(link)

【讨论】:

  • 运行循环的每次迭代都有一个自动释放池并不意味着您不想在代码中的某些地方放置自己的自动释放池。
  • true--不完整的答案。我会扩展它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多