更好的做法是在CFRelease之后使CFTypeRef为空?

时间:2014-01-05 10:08:01

标签: objective-c memory-management core-foundation

CFRelease是否应始终跟随NULL分配?请考虑以下代码

personRef是一个ABRecordRef,我试图从中提取地址标签。

ABMultiValueRef addrRef = ABRecordCopyValue(personRef, kABPersonAddressProperty);
CFStringRef lbl = ABMultiValueCopyLabelAtIndex(addrRef, i);
if(lbl!=NULL) {
    //fetch the label and store it in NSString here.
    //...
    CFRelease(lbl);
    lbl=NULL; //Is it a better practice or mandatory to assign lbl to NULL?
}

我仍然可以在调试窗口中看到一些地址值,这就是我要问的原因: - )

2 个答案:

答案 0 :(得分:3)

设置为NULL会使您传递该值的下一个函数更加可靠,以便对其进行barf。

如果不这样做,该值可能“足够有效”,并且在发布之后的一段时间内似乎仍然可以工作,或者工作很奇怪。最终它会爆炸,然后调试起来要困难得多。

如果您可以保证在释放上一个对象之后并且在尝试再次使用该变量之前,该变量将始终设置为全新的活动对象,那么您可以跳过{{ 1}}赋值和分析器甚至可能会抱怨它(它会将NULL赋值称为“死存储”)。

但是,只要变量可能在发布和下次使用之间重置,那么您应该在发布后立即将其设置为NULL。分析仪可以捕获一些问题,但不是全部。将变量设置为NULL会使您的程序更容易以您能够识别和调试的方式崩溃,并使其更容易崩溃到更接近问题的实际来源(您需要的过早发布或遗漏点)创建或获取新对象。)

如有疑问,请将其设为NULL。只有在分析仪抱怨的情况下才能将其取出,即便如此,如果出于美观或一致性的原因,您可能更愿意将其留在并满足分析仪的反对意见。

答案 1 :(得分:2)

除非你在代码中稍后对变量进行了进一步的测试(即有时候变量可能是NULL,这在你的代码中是合法的)。 >