0

首先,我使用ARC。内存管理和静态CoreFoundation变量

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

static CFNumberRef numberRef = NULL; 

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

我怎么会去释放numberRef

+0

这看起来像一个单身人士。所以把它当作单例:不要释放它。内核将在您的应用退出时清理所有内存。 – 2012-12-24 17:02:39

+0

@ H2CO3我想这应该是正确的答案,并且没错,我没有看到任何泄漏。 –

+0

我为未来的参考做出了答案。 – 2012-12-24 17:34:59

回答

1

由于您使用的模式类似于创建和管理单身人士的方式,因此我认为您可以将您的对象视为实际的单身人士。这意味着你不需要释放它。 (想一想 - 就我个人而言,我从来没有在Objective-C/Cocoa中看到一个关心释放共享实例的单例实现)。这种行为与您需要该对象在您的应用程序的整个生命周期中保持活动的事实相符。所以不要释放它 - 当进程终止时,内核将确保清除它所获取的所有资源。

0

所有的coreFoundation默认为assign -ed,所以它永远不会被保留,因此不需要释放。

要明确,ARC对Core Foundation对象无任何影响。它不会尝试自动管理它们,所以你需要manually manage它们。

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

编辑:

问:我只是想清楚地明白这一点......即使ARC,我们仍然担心这样做CFRelease()和其它类型版本,如CGContextRelease(背景);

Ans:正确。 ARC只处理ObjC对象。它不知道有关Core Foundation对象的任何信息。

+0

也许我不清楚,但我正在谈论你必须'CFRelease'。 –

+0

看到我的编辑,仍然不清楚,不害羞戳我:) –

1

释放它,你知道你不会再需要它。我假设它是静态的,因为你有很多这些类,并且总是需要这个内存?我建议在applicationWillTerminate。如果你没有很多类,并且不总是需要这些内存,那么可能将它声明为静态是没有必要的。

+0

我在'UITableViewCell'情况下使用'drawRect'每秒被调用多次。你将如何在AppDelegate之外的'applicationWillTerminate:'中释放它? –

+0

这听起来像你需要一个const,而不是一个静态的。 – estobbart

+0

@BoA:许多应用程序委托方法对应于通知。这是其中之一;它是[UIApplicationWillTerminateNotification](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html#//apple_ref/c/data/UIApplicationWillTerminateNotification)。 –