2012-06-19 67 views
1

我用這個代碼來獲得ABPerson發佈CFString字符串

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

它做工精細,當姓氏的值不等於空 但是當這個值爲NULL的應用程序崩潰的第三行,因爲我嘗試relese NULL

問題是女巫是在這種情況下釋放CFString字符串,而不會導致應用

回答

6

只需使用一個if檢查NULL墜毀的最佳途徑。

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

在調用'CFRetain()'或'CFRelease()'之前,您必須*總是*執行此操作。這是這些職能合同的一部分。 –

2

CFRelease是舊的C風格的代碼。在調用CFRelease之前,應該先檢查NULL,並在調用CFRelease之後將lastNameRef設置爲NULL。

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

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 
+0

你不能用ARC做到這一點。 –

+0

最初的問題是針對非ARC,可以通過(NSString *)強制推導出來。 要使用ARC來完成此操作,請將(NSString *)替換爲(__bridge_transfer NSString *)並刪除release/autorelease行。 –

相關問題