2

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

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

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

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

4

3 回答 3

6

只需使用 if 来检查 NULL。

if (lastNameRef != NULL)
    CFRelease(lastNameRef);
于 2012-06-19T14:07:45.353 回答
2

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
于 2012-06-19T14:18:56.223 回答
2

CFRelease 是旧的 C 风格代码。在调用 CFRelease 之前应该检查 NULL,因为在调用 CFRelease 之后也将 lastNameRef 设置为 NULL。

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

于 2012-06-19T14:13:18.363 回答