Objective c 内存管理和静态CoreFoundation变量

Objective c 内存管理和静态CoreFoundation变量,objective-c,memory-management,static,automatic-ref-counting,core-foundation,Objective C,Memory Management,Static,Automatic Ref Counting,Core Foundation,首先,我使用的是ARC 例如,如果我有一个类,看起来像这样: static CFNumberRef numberRef = NULL; + (void)initialize { float myFloat = 28.37202; numberRef = CFNumberCreate(kCFAllocatorDefault, CFNumberFloatType, &myFloat); } 如何发布numberRef?默认情况下,所有coreFoundation都是ass

首先,我使用的是ARC

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

static CFNumberRef numberRef = NULL;

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

如何发布
numberRef

默认情况下,所有coreFoundation都是
assign
-ed,因此它从不保留,因此无需发布

显然,圆弧对核心基础物体没有任何影响。它不会尝试自动管理它们,因此您需要对它们进行管理

如果您通过
calloc/malloc
创建自己的内存,那么您需要
释放它们

编辑:

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


答:对。ARC仅处理ObjC对象。它对核心基础对象一无所知。 把它放在你知道不再需要的地方。我假设它是静态的,因为你有很多这样的类,并且总是需要这个内存?我建议在
应用程序中终止
。如果您没有太多的类,也不总是需要内存,那么可能不需要将其声明为静态。

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

也许我不清楚,但我说的是那些必须
CFRelease
的资源。我在
UITableViewCell
情况下使用它,
drawRect
每秒调用多次。您将如何在AppDelegate之外的
applicationWillTerminate:
中释放它?听起来您需要的是常量,而不是静态的。@BoA:许多应用程序委托方法对应于通知。这是其中之一;是的,这看起来像个单身汉。所以把它当作一个单件:根本不要释放它。当你的应用程序退出时,内核将清除所有内存。@H2CO3我想这是正确的答案,而且我看不出有任何漏洞。我做了一个答案供将来参考。