我使用此代码获取ABPerson的姓氏
CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
NSString *friendLastName = (NSString*)lastNameRef;
CFRelease(lastNameRef);
当姓氏值不等于NULL时,它可以正常工作 但是当这个值为NULL时,应用程序在第三行崩溃,因为我试图释放NULL
问题是女巫是在这种情况下释放CFString而不会导致应用程序崩溃的最佳方法
答案 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