Я внедряю ABAddressBook
в iOS 8, и я начал с создания образца проекта, чтобы начать работу. Я создал проект с использованием шаблона приложения Single View. В viewDidAppear
от ViewController.swift
ViewController
Я добавил код ниже:Утечка памяти в ABAddressBook iOS 8 в Swift
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())
}
Это единственный код, у меня есть и приложение протечки! Я запускаю инструмент «Утечки», и он не дает достаточно хорошего контекста, почему приложение протекает.
Вызов дерева Снимок
Leak цикл Снимок
ли я не выпускать что-то, что должно быть? Также я не могу позвонить CFRelease
, потому что у меня включен ARC.
Этот код выглядит хорошо для меня. Если вы случайно использовали 'takeUnretainedValue' где-нибудь, это может просочиться, но я не вижу ничего в вашем фрагменте кода. У iOS есть несколько подобных крошечных утечек, поэтому я не буду беспокоиться о них, если он не большой или вы видите, что какой-либо из ваших классов не освобождается. Кстати, если возможно, подумайте об использовании структуры «Контакты», которая проще в использовании и не требует хрупкого процесса вызовов «takeRetainedValue», которые делает инфраструктура AddressBook. – Rob
'ABAddressBook' устарел в iOS 9. Вам, вероятно, удастся перейти к использованию' CNContactStore'. – gjeck
@gjeck Я поддерживаю устройства iOS 8, поэтому я не могу использовать CNContactStore на устройствах iOS 8. – lostAtSeaJoshua