【问题标题】:Memory Management and static CoreFoundation variables内存管理和静态 CoreFoundation 变量
【发布时间】:2024-01-17 08:53:01
【问题描述】:

首先,我使用的是 ARC。

如果我有一个类,例如,看起来像这样:

static CFNumberRef numberRef = NULL;

+ (void)initialize {
    float myFloat = 28.37202;
    numberRef = CFNumberCreate(kCFAllocatorDefault, CFNumberFloatType, &myFloat);
}

我将如何释放numberRef

【问题讨论】:

  • 这看起来像一个单例。所以把它当作一个单例:根本不释放它。当您的应用退出时,内核会清理所有内存。
  • @H2CO3 我想这将是正确的答案,而且足够正确,我看不到任何泄漏。
  • 我做了这个答案以供将来参考。

标签: objective-c memory-management static automatic-ref-counting core-foundation


【解决方案1】:

由于您使用的模式类似于创建和管理单例的方式,我想说您可以将您的对象视为实际的单例。这意味着您不需要释放它。 (想一想——就个人而言,我从未见过 Objective-C/Cocoa 中的单例实现会关心释放共享实例)。此行为与您需要对象在应用程序的整个生命周期内都处于活动状态这一事实一致。所以根本不要释放它——当进程终止时,内核会确保清理它获得的所有资源。

【讨论】:

    【解决方案2】:

    所有coreFoundation默认都是assign-ed,所以永远不会被保留,所以不需要释放。

    需要明确的是,ARC 对 Core Foundation 对象没有任何影响。它不会尝试自动管理它们,因此您需要manually manage它们。

    如果你通过calloc/malloc创建自己的内存,那么你需要free他们。

    编辑:

    问:我只是想清楚地理解这一点......即使使用 ARC,我们仍然需要担心执行 CFRelease() 以及其他类型的发布,例如 CGContextRelease(context);

    回答:正确。 ARC 只处理 ObjC 对象。它对 Core Foundation 对象一无所知。

    【讨论】:

    • 也许我不清楚,但我说的是那些你必须CFRelease
    【解决方案3】:

    在您知道不再需要它的地方发布它。我假设它是静态的,因为你有很多这样的类并且总是需要这个内存?我建议applicationWillTerminate。如果您没有很多类并且并不总是需要内存,那么可能不需要将其声明为静态。

    【讨论】:

    • 我在UITableViewCell 的情况下使用它,其中drawRect 每秒被调用多次。您将如何在 AppDelegate 之外的 applicationWillTerminate: 中发布它?
    • 听起来你需要一个 const,而不是 static。
    • @BoA:很多应用程序委托方法对应于通知。那就是其中之一;这是UIApplicationWillTerminateNotification