iOS通讯录出现奇怪的内存泄漏

时间:2011-12-26 09:18:38

标签: ios arrays memory-management addressbook

我的一个功能中有以下功能来复制手机上的联系人:

    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 :(得分:0)

您不应该发布ABAddressBookCreate返回的地址簿。遵循约定,创建和返回对象的方法应该使它成为autorelease

然而,行

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

肯定是在泄漏。为什么?,因为ABAddressBookCopyArrayOfAllPeople正在创建一个新对象,您再次保留:self.contacts =。所以你应该改变它

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

或使用另一种不会创建新联系人数组的方法。