我正在阅读此链接https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/WorkingWithCocoaDataTypes.html,在有关内存管理对象的部分中,他们讨论了带注释的API。但是,我无法找到带注释的API的定义。任何人都知道这意味着什么?
答案 0 :(得分:3)
基本上,Apple必须通过所有API并使用有关参数和返回值的内存分配信息来注释每个函数。一旦完成,可以更容易地在Swift中使用带注释的函数,因为编译器知道如何安全地将类型从Swift代码到来回注释到带注释的C代码。
这是类似注释和未注释函数的示例。首先,C版本:
// Creates an immutable copy of a string.
CFStringRef CFStringCreateCopy ( CFAllocatorRef alloc, CFStringRef theString );
// Encodes an OSType into a string suitable for use as a tag argument.
CFStringRef UTCreateStringForOSType ( OSType inOSType );
这两个函数都返回CFStringRef
- 对CFString
的引用。 C CFString
可以桥接到Swift CFString
实例,但只有在注释方法时才能安全。以下是Swift版本:
// annotated: returns a memory-managed Swift `CFString`
func CFStringCreateCopy(alloc: CFAllocator!, theString: CFString!) -> CFString!
// unannotated: returns an *unmanaged* `CFString`
func UTCreateStringForOSType(inOSType: OSType) -> Unmanaged<CFString>!
如果您要拨打第二个,则需要在结果上调用.takeRetainedValue()
或.takeUnretainedValue()
以获取内存管理的CFString
实例 - 知道哪一个,您必须阅读文档或了解约定,以了解您获得的结果是保留还是未保留。通过带注释的功能,Apple已经为您完成了这项工作。
论坛上有几个关于这个问题的主题,因为Apple也指出返回值是否应该是带注释的可选项,但是他们现在仍然非常接近。