CF内存分配示例

时间:2013-05-25 14:35:32

标签: cocoa core-foundation

阅读有关CF内存管理的Apple文档,我看到一个例子:

static CFStringRef title = NULL;
void SetTitle(CFStringRef newTitle) {
    CFStringRef temp = title;
    title = CFStringCreateCopy(kCFAllocatorDefault , newTitle);
    CFRelease(temp);
}

它表示如果newTitletitle指向同一内存位置,则使用临时引用进行发布。但我不确定我是否理解如果只发布title然后创建副本会发生什么。

1 个答案:

答案 0 :(得分:3)

问题是newTitletitle都是指针,而指针可以指向相同的内存位置。

想象一下,如果你把它作为

static CFStringRef title = NULL;
void SetTitle(CFStringRef newTitle) {
    CFRelease(title);
    title = CFStringCreateCopy(kCFAllocatorDefault, newTitle);
}

摆脱了temp变量,看起来更简单。这一切都很好。

但是,如果你这样做了

SetTitle(title);

因此,当您进入该功能时,newTitletitle都指向同一地址!所以函数的第一行将释放title;但这也是同时发布newTitle(因为它们是相同的!)。

因此,当它到达函数的第二行时,newTitle所在的内存已消失。也许它被淘汰了。也许它被用来举行战争与和平的前几章。我们不知道,但我们确实知道它绝对不再是这个函数所期望的newTitle并且本质上是垃圾内存。

因此函数的第二行将尝试制作垃圾内存的副本。如果你非常,非常非常幸运,你的应用程序将崩溃。但我很确定这最终会导致不确定的行为,所以如果你的电脑自焚并开始唱“上帝拯救女王”,你只能责怪自己。

在Apple的版本中,它将原始title放入临时变量,创建副本,然后释放原始title。这很好,因为副本不会在垃圾数据上完成,而且你的计算机仍然没有火上浇油。

双赢。