2013-05-25 39 views
0
在CF内存管理

阅读苹果文档,我看到一个例子:CF内存分配例如

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

它说,释放的情况下,newTitle使用临时参考制成,title都指向同一个内存位置。但我不确定我是否理解如果只发布title然后创建副本会发生什么情况。

回答

3

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

如果你有它作为

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

它摆脱了临时变量的和看起来很简单,所以,想象一下。这一切都很好。

但是,如果你再这样做

SetTitle(title); 

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

因此,当它到达函数的第二行时,newTitle所在的内存已经消失。也许它已经被清零了。也许它被用来持有战争与和平的前几章。我们不知道,但我们确实知道这绝对不是这个函数所期待的newTitle,实质上是垃圾内存。

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

在苹果的版本,它撇开原来的title到一个临时变量,创建副本,然后释放什么是原来的title。这很好,因为复制不会在垃圾数据上完成,并且您的计算机仍然不失火。

双赢。

+2

感谢您的有趣和有趣的解释。我的理解是,CFRelease只是标志着像autorelease一样被删除的对象。但是现在我知道一旦我调用'CFRelease',我就不应该认为该对象是有效的。 – Pablo