Странная утечка памяти с адресной книгой iOS - PullRequest
1 голос
/ 26 декабря 2011

У меня есть ниже в одной из моих функций, чтобы скопировать контакты на телефоне:

    ABAddressBookRef addressbook = ABAddressBookCreate();
    if(self.contacts != nil)
        [contacts release];
    self.contacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(address book);

contacts - это NSArray, объявленный в классе, сохраненный, синтезированный и др. Затем массив используется в другом контроллере представления:

    if (!self.contactsViewController) {
        self.contactsViewController = [[[contactsViewController alloc] initWithNibName:@"ContactsViewController" bundle:nil] autorelease];
    }
    self.contactsViewController.contacts = self.contacts;
    [self.navigationController pushViewController:self.contactsViewController animated:YES];

Я знаю, что вы должны освободить адресную книгу, но когда я это сделаю, у контактов, скопированных в viewController, останутся только их имена; все телефонные номера и электронные письма исчезают, когда я звоню им с ABPersonViewController. С другой стороны, он отлично работает, когда я не выпускаю адресную книгу, но теряет память по всему полу. Что происходит и как мне это исправить?

1 Ответ

0 голосов
/ 26 декабря 2011

Вы не должны выпускать адресную книгу, возвращенную ABAddressBookCreate.Следуя соглашениям, методы, которые создают и возвращают объект, должны сделать его autorelease.

Тем не менее, строка

self.contacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(address book);

определенно протекает.Почему? Хорошо, потому что ABAddressBookCopyArrayOfAllPeople создает новый объект, который вы снова сохраняете: self.contacts =.Поэтому вы должны либо изменить его на

contacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(address book);

, либо использовать другой метод, который не создает новый массив контактов.

...