освободить CFString

Я использую этот код, чтобы получить фамилию ABPerson

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

он отлично работает, когда значение last name не равно NULL, но когда это значение равно NULL, приложение аварийно завершает работу на третьей строке, потому что я пытаюсь освободить NULL

вопрос в том, что это лучший способ освободить CFString в этом случае, не вызывая сбоя приложения.


person iArezki    schedule 19.06.2012    source источник


Ответы (3)


Просто используйте if для проверки на NULL.

if (lastNameRef != NULL)
    CFRelease(lastNameRef);
person Hampus Nilsson    schedule 19.06.2012
comment
Вы должны всегда делать это перед вызовом CFRetain() или CFRelease(). Это часть контрактов этих функций. - person Jonathan Grynspan; 19.06.2012

CFRelease — это старый код в стиле C. Перед вызовом CFRelease следует проверить наличие NULL, а также установить для lastNameRef значение NULL после вызова CFRelease.

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

person Aditya Kumar Pandey    schedule 19.06.2012

CFRelease ожидает ненулевой указатель. Вы можете проверить это с помощью инструкции if, но вместо этого проще просто выпустить или автоматически выпустить friendLastName:

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

Поскольку вы, похоже, не используете lastNameRef, вы также можете встроить эту переменную:

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

or

NSString *friendLastName = (NSString*)ABRecordCopyValue((ABRecordRef)personRecordRef, kABPersonLastNameProperty);
[friendLastName autorelease];
// use friendLastName
person Tammo Freese    schedule 19.06.2012
comment
Первоначальный вопрос был для не-ARC, о чем можно судить по приведенному в нем (NSString *). Чтобы сделать это с помощью ARC, замените (NSString *) на (__bridge_transfer NSString *) и удалите строки Release/AutoRelease. - person Tammo Freese; 19.06.2012