2012-06-12 56 views
1

我對使用「CFStringRef」有疑問。我見過管理iPhone接觸的幾個例子,在大多數人,他們使用:使用鑄造而不是CFStringRef獲取聯繫信息

... 
ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); 
CFStringRef emailRef = ABMultiValueCopyValueAtIndex(emails, 0); 
... 
NSString *email = (NSString *)emailRef; 

我不知道爲什麼CFStringRef被替代使用的鑄造:

... 
ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); 
NSString *email = (NSString *)ABMultiValueCopyValueAtIndex(emails, 0); 
... 

它是傳統的以使用CFStringRef?使用直接投射是否正確?

回答

0

CFString是與其可可基金會對應部門 NSString的「免費橋接」。這意味着核心基礎類型在橋接基礎對象的函數或方法調用中可互換 。 因此,在您看到NSString *參數的方法中,您可以在CFStringRef中傳遞 ,並且在看到CFStringRef參數的函數中,您可以傳入NSString實例。這也適用於NSString的具體子類 。

兩者都是相同的。

0

沒有區別,第一個例子只是使用一個額外的臨時變量。儘管你應該關注內存管理方面,但執行一個直接演員是完全可以的。聽起來像ABMultiValueCopyValueAtIndex返回一個保留的對象,雖然文檔不清楚。

+0

感謝您的回答。關於釋放內存,據我所知它需要釋放它(使用'CFRelease(emailRef)'),正如我在本指南中所見(https://developer.apple.com/library/mac/#documentation /CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html) – rai212