Core Foundation
Swift中的 Core Foundation 类型是一个成熟的类。当出现内存管理注释时,Swift 会自动地管理 Core Foundation 对象的内存,这其中包括你实例化了的 Core Foundation 对象。在 Swift 中,你可以自由变换 Fundation 和 Core Foundation 类型。如果你想先转换为桥接 Foundation 类型时,你也可以桥接一些 toll-free bridged Core Foundation 类型到 Swift 标准库类型。
1.重定义类型
当 Swift 导入 Core Foundation 类型时,编译器会重映射导入的类型名字。编译器会从每个类型名字的末端移除Ref,这是因为所有的 Swift 类都属于引用类型,因此后缀是多余的。
Core Foundation 中的CFTypeRef类型会对Anyobject类型重映射。所以你以前使用的CFTypeRef,现在该换成AnyObject了。
2.内存管理对象
在 Swift 中,从 annotated APIs 返回的 Core Foundation 对象能够自动进行内存管理--你不再需要调用自身的CFRetain,CFRelease,或者CFAutorelease函数。如果你从自身的C函数和 Objective-C 方法中返回一个 Core Foundation 对象,你需要用CF_RETURNS_RETAINED或者CF_RETURNS_NOT_RETAINED注释这个对象。当 Swift 代码中包含这些 APIs 时,编译器会在编译时自动调用内存管理。如果你只调用那些不会间接返回 Core Foundation 对象的 annotated APIs,那么现在你可以跳过本节的剩余部分了。否则,下面我们继续学习非托管的 Core Foundation 对象。
3.非托管对象
当 Swift 导入 unannotated 的APIs时,编译器将不会自动地对返回的 Core Foundation 对象进行内存管理托管。Swift 将这些返回的 Core Foundation 对象封闭在一个Unmanaged<T>结构中。那些间接返回 Core Foundation 的对象也是非托管的。举个例子,这里有一个 unannotated 的 C 函数:
这里说明了Swift是怎么导入的:
假设您从 unannotated APIs 接收了非托管的对象,在使用它之前,你必须将它转换为能够内存管理的对象。在这方面,Swift 可以帮你进行内存管理而不用自己动手。同时,Unmanaged<T>结构也提供了两个方法来把一个非托管对象转换为一个可内存管理的对象--takeUnretainedValue()方法和takeRetainedValue()方法。这两个方法会返回原始的,非封闭的对象类型。您可以根据您实际调用的APIs返回的unretained或retained的对象,来选择哪一方法更合适。
比如,假设这里有一个 C 函数,这个函数在返回值前不会释放CFString对象。在使用这个对象前,您使用takeUnretainedValue()函数,以将它转换为一个能够内存管理托管的对象。
let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue()
这样的话 你就可以把这个属性转换成任意类型了。
下边说一下ios9 新出的 ContactsUI 来代替 AddressBookUI
太简单了。这个就是面对对象来操作的。
首先设置属性以及代理。以及遵守协议。
viewController: UIViewController,CNContactPickerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let vc = CNContactPickerViewController()
vc.delegate = self
self.presentViewController(vc, animated: true, completion: nil)
然后实现代理方法。
func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) {
let name = contact.familyName
print(name)
}
contact 装的都是对象属性。
哪里不会点哪里
public var identifier: String { get }
public var contactType: CNContactType { get }
public var namePrefix: String { get }
public var givenName: String { get }
public var middleName: String { get }
public var familyName: String { get }
public var previousFamilyName: String { get }
public var nameSuffix: String { get }
public var nickname: String { get }
public var phoneticGivenName: String { get }
public var phoneticMiddleName: String { get }
public var phoneticFamilyName: String { get }
public var organizationName: String { get }
public var departmentName: String { get }
public var jobTitle: String { get }
public var note: String { get }
@NSCopying public var imageData: NSData? { get }
@NSCopying public var thumbnailImageData: NSData? { get }
@available(iOS 9.0, *)
public var imageDataAvailable: Bool { get }
public var phoneNumbers: [CNLabeledValue] { get }
public var emailAddresses: [CNLabeledValue] { get }
public var postalAddresses: [CNLabeledValue] { get }
public var urlAddresses: [CNLabeledValue] { get }
public var contactRelations: [CNLabeledValue] { get }
public var socialProfiles: [CNLabeledValue] { get }
public var instantMessageAddresses: [CNLabeledValue] { get }
/*! The Gregorian birthday. */
@NSCopying public var birthday: NSDateComponents? { get }
/*! The alternate birthday (Lunisolar). */
@NSCopying public var nonGregorianBirthday: NSDateComponents? { get }
```
是不是比core foundation爽多了???