我难住了。
我正在尝试获取一个人拥有的所有电子邮件地址的列表。我正在使用ABPeoplePickerNavigationController
来选择人,这一切似乎都很好。我正在设置我的
ABRecordRef personDealingWith;
从person
论点到
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {
到目前为止,一切似乎都很好。以下代码第一次执行时,一切正常。随后运行时,我会遇到问题。首先,代码:
// following line seems to make the difference (issue 1)
// NSLog(@"%d", ABMultiValueGetCount(ABRecordCopyValue(personDealingWith, kABPersonEmailProperty)));
// construct array of emails
ABMultiValueRef multi = ABRecordCopyValue(personDealingWith, kABPersonEmailProperty);
CFIndex emailCount = ABMultiValueGetCount(multi);
if (emailCount > 0) {
// collect all emails in array
for (CFIndex i = 0; i < emailCount; i++) {
CFStringRef emailRef = ABMultiValueCopyValueAtIndex(multi, i);
[emailArray addObject:(NSString *)emailRef];
CFRelease(emailRef);
}
}
// following line also matters (issue 2)
CFRelease(multi);
如果按书面方式编译,则没有错误或静态分析问题。这崩溃了
*** -[Not A Type retain]: message sent to deallocated instance 0x4e9dc60
错误。
但是等等,还有更多!我可以通过两种方式中的任何一种来修复它。
首先,我可以取消注释函数顶部的 NSLog。ABRecordCopyValue
我每次都从 NSLog 中得到泄漏,但代码似乎运行良好。
另外,我可以注释掉
CFRelease(multi);
最后,它做同样的事情。静态编译错误,但运行代码。
所以如果没有泄漏,这个函数就会崩溃。为了防止崩溃,我需要大量记忆。两者都不是一个很好的解决方案。
谁能指出发生了什么?