我的一个功能中有以下功能来复制手机上的联系人:
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调用它们时,所有电话号码和电子邮件都会消失。另一方面,当我不发布地址簿时,它可以正常工作,但是在整个地板上泄漏了记忆。发生了什么,我该如何解决?
答案 0 :(得分:0)
您不应该发布ABAddressBookCreate
返回的地址簿。遵循约定,创建和返回对象的方法应该使它成为autorelease
。
然而,行
self.contacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(address book);
肯定是在泄漏。为什么?,因为ABAddressBookCopyArrayOfAllPeople
正在创建一个新对象,您再次保留:self.contacts =
。所以你应该改变它
contacts = (NSArray *)ABAddressBookCopyArrayOfAllPeople(address book);
或使用另一种不会创建新联系人数组的方法。