我目前正在查看由NSMutableSet
函数创建的CFSetCreateMutable()
。该文档指出CFSetCreateMutable()
的返回值是免费桥接的,这意味着我可以简单地将其转换为NSMutableSet
。这是否意味着发送release
消息完全有效?我总是可以安全地假设我总是可以将这些对象视为通过NS级alloc
编辑的对象吗?
答案 0 :(得分:7)
想象一下CFSetCreateMutable()
等同于[[NSMutableSet alloc] init],因为你必须在完成后释放它。如果您使用ARC,则可以使用桥接强制转换将{CFMutableSet>强制转换为NSMutableSet:(__bridge_transfer NSMutableSet *)theCFSet
。这将告诉ARC它负责在超出范围后释放它。
答案 1 :(得分:1)
文档说明CFSetCreateMutable()的返回值是免费桥接的,这意味着我可以简单地将它转换为NSMutableSet。这是否意味着向其发送发布消息是完全有效的?
是。 This is explicitly guaranteed in the docs:
从示例中注意,内存管理功能和方法也是可以互换的 - 您可以将
CFRelease
与Cocoa对象一起使用,将release
和autorelease
与Core Foundation对象一起使用。
我是否总是可以安全地假设我可以将这些对象视为通过NS级分配这些对象?
不是真的:目前,CFType和NSObject之间存在的任何共同点,例如-description
/ CFCopyDescription
,无论您如何创建对象,都可以工作,但是并没有明确保证像内存管理消息一样工作。