【发布时间】:2016-06-09 20:27:37
【问题描述】:
我正在 iOS 8 中实现ABAddressBook,我首先创建了一个示例项目以开始工作。我使用 Single View Application 模板创建了项目。在ViewController.swiftViewController的viewDidAppear中我添加了以下代码:
if ABAddressBookGetAuthorizationStatus() != .Authorized {
return
}
var error: Unmanaged<CFError>?
if let addressBook: ABAddressBook? = ABAddressBookCreateWithOptions(nil, &error)?.takeRetainedValue() {
ABAddressBookRequestAccessWithCompletion(addressBook) { granted, error in
if error == nil && granted {
if let contacts = ABAddressBookCopyArrayOfAllPeople(addressBook)?.takeRetainedValue() as? NSArray {
for contact in contacts {
print("new contact")
}
}
}
}
} else {
print(error?.takeRetainedValue())
}
这是我唯一的代码,应用程序正在泄漏!我正在运行 Leaks 工具,但它没有提供足够好的上下文来说明应用程序泄漏的原因。
调用树快照
泄漏周期快照
我没有发布应该发布的东西吗?我也不能打电话给CFRelease,因为我启用了ARC。
【问题讨论】:
-
这段代码对我来说看起来不错。如果您不小心在某处使用了
takeUnretainedValue,那可能会泄漏,但我在您的代码 sn-p 中看不到任何地方。 iOS 确实有一些这样的小漏洞散布在各处,所以我不会担心它们,除非它很大或者你看到你的任何类都没有被释放。顺便说一句,如果可能,请考虑使用 Contacts 框架,它更易于使用,并且不需要像 AddressBook 框架那样脆弱的takeRetainedValue调用过程。 -
ABAddressBook在 iOS 9 中已弃用。您可能会从使用CNContactStore中受益。 -
@gjeck 我支持 iOS 8 设备,所以我不能在 iOS 8 设备上使用 CNContactStore。
标签: ios swift memory-leaks abaddressbook