2012-06-12 18 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