问题是,newTitle
和title
都是指针和指针可以指向相同的内存位置。
如果你有它作为
static CFStringRef title = NULL;
void SetTitle(CFStringRef newTitle) {
CFRelease(title);
title = CFStringCreateCopy(kCFAllocatorDefault, newTitle);
}
它摆脱了临时变量的和看起来很简单,所以,想象一下。这一切都很好。
但是,如果你再这样做
SetTitle(title);
所以,当你进入的功能,既newTitle
和title
都指向同一个地址!所以函数的第一行将会释放title
;但这同时也释放了newTitle
(因为它们是相同的!)。
因此,当它到达函数的第二行时,newTitle
所在的内存已经消失。也许它已经被清零了。也许它被用来持有战争与和平的前几章。我们不知道,但我们确实知道这绝对不是这个函数所期待的newTitle
,实质上是垃圾内存。
因此,该函数的第二行将尝试制作垃圾内存的副本。如果你非常非常幸运,你的应用程序将崩溃。但我很确定这最终会导致不确定的行为,所以如果你的电脑着火并开始唱“God Save The Queen”,你只能责怪自己。
在苹果的版本,它撇开原来的title
到一个临时变量,创建副本,然后释放什么是原来的title
。这很好,因为复制不会在垃圾数据上完成,并且您的计算机仍然不失火。
双赢。
感谢您的有趣和有趣的解释。我的理解是,CFRelease只是标志着像autorelease一样被删除的对象。但是现在我知道一旦我调用'CFRelease',我就不应该认为该对象是有效的。 – Pablo