//获取共享地址簿的实例 ABAddressBookRef addressBook = ABAddressBookCreate();
//get all contacts in addressbook
CFArrayRef allContacts = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex numPeople = ABAddressBookGetPersonCount(addressBook);
self.contacts = [NSMutableArray array];
//modify data to be stored in an array
for (int i = 0; i < numPeople; i++) {
AddressBookPerson *person = [[AddressBookPerson alloc] init];
ABRecordRef ref = CFArrayGetValueAtIndex(allContacts, i);
NSString *firstName = (NSString *)ABRecordCopyValue(ref, kABPersonFirstNameProperty);
NSString *lastName = (NSString *)ABRecordCopyValue(ref, kABPersonLastNameProperty);
ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(ref, kABPersonPhoneProperty);
NSArray* phoneNumbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty);
CFRelease(phoneNumberProperty);
NSString *contactFirstLast = [NSString stringWithFormat: @"%@, %@", firstName, lastName];
person.name = contactFirstLast;
person.phoneNumbers = phoneNumbers;
[self.contacts addObject:person];
//self.contacts = [NSArray arrayWithArray:listOfContacts];
[contactFirstLast release];
[person release];
}
我不确定为什么这个属性不会保留。我甚至尝试过尝试过的变体,例如:
self.contacts = [[NSMutableArray alloc] init];
它被分配,但我放在里面的任何对象都没有被保留。我一共使用了一个不同的数组,它不是属性,对象保留得很好。但问题是我需要一个包含值的全局属性。
更新
我找到了问题的解决方案。我运行了分析并进行了ref计数,我得到了没有内存泄漏的点。但问题仍然存在,这是因为该物业的名称。
“contacts”是“可用于启动连接和管理传入连接请求的MIDI网络主机集”的内置属性。
我将我的财产命名为一个独特的名称,所有问题都消失了。不需要静态变量,我理解,我正在使用该变量进行测试,以查看我的对象发生了什么。静态变量工作的原因是因为它是唯一命名的。
答案 0 :(得分:2)
简短回答: NSMutableArray保留对象,程序的实现在引用计数中有错误。
请删除所有编译器警告,然后运行静态分析器并修复这些问题。
(静态分析器应该指出程序中的引用计数错误)
<强>更新强>
静态分析显示:
contactFirstLast << over-release
allContacts << leaked
firstName << leaked
lastName << leaked
phoneNumbers << leaked
每4行代码会出现一个引用计数问题,并且有一些工具可以帮助您=)
在你能正确进行引用计数之前,你真的不能编写一个重要的程序。你应该知道这一点,它是自动的。
我指出的那5个问题可能无法解决您在执行过程中遇到的第一个问题,但在您的程序中修复这些问题中的每个问题都会删除程序中的许多活动错误(它们等待被发现。)
答案 1 :(得分:0)
我注意到了一件事。
您不应该释放尚未分配的对象。
[contactFirstLast release];
请删除该行。