【问题标题】:Should I use Autoreleasepool in library我应该在库中使用 Autoreleasepool
【发布时间】:2015-09-28 07:12:05
【问题描述】:

我有一个头文件(C Like)

而且我必须创建一个实现它的 Obj-c 库(或者只是几个 .m -s)。

调用该库的都是 C 程序。

但是我不想手动处理内存分配,我想使用 ARC。

我可以在我的函数中使用autoreleasepool{} 以使 ARC 正常工作...

或者我必须在几年后回去/卸载我的懒惰并手动执行此操作?

【问题讨论】:

    标签: objective-c macos cocoa automatic-ref-counting nsautoreleasepool


    【解决方案1】:

    我可以在我的函数中使用 autoreleasepool{} 以使 ARC 正常工作...

    @autoreleasepool 不仅适用于 ARC。您可以将@autoreleasepool-fobjc-arc-fno-objc-arc 一起使用。

    http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool

    @autoreleasepool 可用于非 ARC 翻译单元,具有等效语义。

    另外,

    调用该库的都是 C 程序。

    已编辑

    您的意思是应用程序是用 C 语言编写的,而库程序是用 Objective-C 语言编写的?在这种情况下,您应该在代码中使用@autoreleasepool。通常,对于 OS X Cocoa 应用程序,有一个具有 Autorelease Pool 的 runloop,因此在某些特定情况(例如,避免大量内存使用)之前,无需在代码中使用 @autoreleasepool

    已编辑

    无论如何,你可以在你的库代码中使用 ARC,但它应该使用-fobjc-arc 选项编译。

    【讨论】:

    • 谢谢!我怀疑它不会解决我的问题。顺便说一句,它不是应用程序,它是守护进程......所以在 obj-c 库之外不会有任何 autorekease 拉取。
    【解决方案2】:

    我可以在我的函数中使用 autoreleasepool{} 以使 ARC 正常工作...

    是的。如果你是从 C 调用的,你必须在每个 C 入口点都这样做,否则你几乎肯定会泄漏内存。如果您没有这样做,您应该会在控制台上看到类似“Autoreleased object while no autorelease pool. Just leaking”之类的消息。

    【讨论】:

    • 感谢您的回答!我投票赞成更详细的答案。但非常感谢!
    • 实际上从 iOS 7 / Mac OS X 10.9 开始,如果您在没有池的情况下自动释放,则不会泄漏或打印消息。
    • 这是一个非常重要的答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2016-05-24
    • 2011-02-23
    相关资源
    最近更新 更多