发布CFString

时间:2012-06-19 14:00:37

标签: iphone objective-c ios memory-management cfstring

我使用此代码获取ABPerson的姓氏

CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
NSString *friendLastName = (NSString*)lastNameRef;
CFRelease(lastNameRef);

当姓氏值不等于NULL时,它可以正常工作 但是当这个值为NULL时,应用程序在第三行崩溃,因为我试图释放NULL

问题是女巫是在这种情况下释放CFString而不会导致应用程序崩溃的最佳方法

3 个答案:

答案 0 :(得分:6)

只需使用if来检查NULL。

if (lastNameRef != NULL)
    CFRelease(lastNameRef);

答案 1 :(得分:2)

CFRelease是旧的C样式代码。在调用CFRelease之前应检查NULL,并在调用CFRelease后将lastNameRef设置为NULL。

if (lastNameRef != NULL) { CFRelease(lastNameRef); lastNameRef = NULL; }

答案 2 :(得分:1)

CFRelease需要一个非NULL指针。您可以使用if语句检查,但更容易简单地发布或自动发布friendLastName

CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
NSString *friendLastName = (NSString*)lastNameRef;
// use friendLastName
[friendLastName release];

CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
NSString *friendLastName = (NSString*)lastNameRef;
[friendLastName autorelease];
// use friendLastName

由于您似乎不使用lastNameRef,您还可以内联该变量:

NSString *friendLastName = (NSString*)ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
// use friendLastName
[friendLastName release];

NSString *friendLastName = (NSString*)ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
[friendLastName autorelease];
// use friendLastName