I use this code to get the last name of ABPerson

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

it work fine when the value of last name is not equal to NULL but when the this value is NULL the application crash at the third line because I try to relese NULL

the question is witch is the best way to releasing the CFString in this case without causing the crash of the application

有帮助吗?

解决方案

Just use an if to check for NULL.

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

其他提示

CFRelease is old C style code. One should check for NULL before calling CFRelease as also set lastNameRef to NULL after calling CFRelease.

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

CFRelease expects a non-NULL pointer. You could check for that with an if statement, but it is easier to simply release or autorelease friendLastName instead:

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

or

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

As you don't seem to use lastNameRef, you could also inline that variable:

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

or

NSString *friendLastName = (NSString*)ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
[friendLastName autorelease];
// use friendLastName
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top