阅读有关CF内存管理的Apple文档,我看到一个例子:
static CFStringRef title = NULL;
void SetTitle(CFStringRef newTitle) {
CFStringRef temp = title;
title = CFStringCreateCopy(kCFAllocatorDefault , newTitle);
CFRelease(temp);
}
它表示如果newTitle
和title
指向同一内存位置,则使用临时引用进行发布。但我不确定我是否理解如果只发布title
然后创建副本会发生什么。
答案 0 :(得分:3)
问题是newTitle
和title
都是指针,而指针可以指向相同的内存位置。
想象一下,如果你把它作为
static CFStringRef title = NULL;
void SetTitle(CFStringRef newTitle) {
CFRelease(title);
title = CFStringCreateCopy(kCFAllocatorDefault, newTitle);
}
摆脱了temp变量,看起来更简单。这一切都很好。
但是,如果你这样做了
SetTitle(title);
因此,当您进入该功能时,newTitle
和title
都指向同一地址!所以函数的第一行将释放title
;但这也是同时发布newTitle
(因为它们是相同的!)。
因此,当它到达函数的第二行时,newTitle
所在的内存已消失。也许它被淘汰了。也许它被用来举行战争与和平的前几章。我们不知道,但我们确实知道它绝对不再是这个函数所期望的newTitle
并且本质上是垃圾内存。
因此函数的第二行将尝试制作垃圾内存的副本。如果你非常,非常非常幸运,你的应用程序将崩溃。但我很确定这最终会导致不确定的行为,所以如果你的电脑自焚并开始唱“上帝拯救女王”,你只能责怪自己。
在Apple的版本中,它将原始title
放入临时变量,创建副本,然后释放原始title
。这很好,因为副本不会在垃圾数据上完成,而且你的计算机仍然没有火上浇油。
双赢。