- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码有一个非常奇怪的错误。事实上,根本没有错误,只是调试器以“程序收到信号:“EXC_BAD_ACCESS””消息开始。谁能帮我?我非常困惑...谢谢。
-(NSString *)fullNameForPhone:(NSString *)ph withAlternativeText:(NSString *)text
{
ABAddressBookRef addressBookRef = ABAddressBookCreate();
NSLog(@"create addressBookRef");
NSString *stringToReturn = text;
CFArrayRef allPeopleRef = ABAddressBookCopyArrayOfAllPeople(addressBookRef);
NSLog(@"create allPeopleRef");
CFIndex nPeople = ABAddressBookGetPersonCount(addressBookRef);
int i = 0;
BOOL nameFound = NO;
while ((i < nPeople) && (!nameFound))
{
ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);
NSLog(@" create recordRef");
CFStringRef allRecordPhonesRef = ABRecordCopyValue(recordRef, kABPersonPhoneProperty);
NSLog(@" create allRecordPhonesRef");
CFIndex nPhones = ABMultiValueGetCount(allRecordPhonesRef);
int currentPhone = 0;
for (currentPhone = 0; currentPhone < nPhones; currentPhone++)
{
CFStringRef currentPhoneNumberRef = ABMultiValueCopyValueAtIndex(allRecordPhonesRef, currentPhone);
NSLog(@" create currentPhoneNumberRef");
NSString *currentCleanPhoneNumber = [self cleanPhoneNumberForString:[NSString stringWithFormat:@"%@", currentPhoneNumberRef]];
if (currentPhoneNumberRef!=NULL)
{
NSLog(@" release currentPhoneNumberRef");
CFRelease(currentPhoneNumberRef);
}
if ([ph isEqualToString:currentCleanPhoneNumber])
{
CFStringRef firstName = ABRecordCopyValue(recordRef, kABPersonFirstNameProperty);
CFStringRef lastName = ABRecordCopyValue(recordRef, kABPersonLastNameProperty);
NSString *fullName = [self fullNameForFirstName:[NSString stringWithFormat:@"%@", firstName]
andLastName:[NSString stringWithFormat:@"%@", lastName]];
if (firstName != NULL)
CFRelease(firstName);
if (lastName != NULL)
CFRelease(lastName);
stringToReturn = fullName;
nameFound = YES;
break;
}
}
CFRelease(allRecordPhonesRef);
NSLog(@" release allRecordPhonesRef");
CFRelease(recordRef);
NSLog(@" release recordRef");
i++;
}
CFRelease(allPeopleRef);
NSLog(@"release allPeopleRef");
CFRelease(addressBookRef);
NSLog(@"release addressBookRef");
return stringToReturn;
}
控制台输出为:
2009-07-31 00:20:05.230 abmodular[21747:20b] create addressBookRef
2009-07-31 00:20:05.231 abmodular[21747:20b] create allPeopleRef
2009-07-31 00:20:05.231 abmodular[21747:20b] create recordRef
2009-07-31 00:20:05.232 abmodular[21747:20b] create allRecordPhonesRef
2009-07-31 00:20:05.232 abmodular[21747:20b] create currentPhoneNumberRef
2009-07-31 00:20:05.232 abmodular[21747:20b] release currentPhoneNumberRef
2009-07-31 00:20:05.232 abmodular[21747:20b] create currentPhoneNumberRef
2009-07-31 00:20:05.233 abmodular[21747:20b] release currentPhoneNumberRef
2009-07-31 00:20:05.233 abmodular[21747:20b] release allRecordPhonesRef
2009-07-31 00:20:05.233 abmodular[21747:20b] release recordRef
2009-07-31 00:20:05.233 abmodular[21747:20b] create recordRef
2009-07-31 00:20:05.234 abmodular[21747:20b] create allRecordPhonesRef
2009-07-31 00:20:05.234 abmodular[21747:20b] create currentPhoneNumberRef
2009-07-31 00:20:05.234 abmodular[21747:20b] release currentPhoneNumberRef
2009-07-31 00:20:05.234 abmodular[21747:20b] release allRecordPhonesRef
2009-07-31 00:20:05.235 abmodular[21747:20b] release recordRef
2009-07-31 00:20:05.235 abmodular[21747:20b] release allPeopleRef
[Session started at 2009-07-31 00:20:05 +0400.]
GNU gdb 6.3.50-20050815 (Apple version gdb-966)
....
Attaching to process 21747.
kill
quit
The Debugger has exited with status 0.(gdb)
按“继续”会输出“EXC_BAD_ACCESS”消息。 Xcode 显示,我的代码中最新执行的字符串是 CFRelease(addressBookRef);
最佳答案
我在做类似的事情时遇到了同样的问题,经过进一步的研究,我发现我过度释放了。根据Core Foundation docs :
If you create or copy a Core Foundation object, you must subsequently release it when you’re finished with it.
我认为这意味着您不应该发布带有 Get 一词的函数。如果这样做,当真正的所有者尝试释放它时,将会导致问题。因此,在这种情况下,当您这样做时:
ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);
及以后:
CFRelease(recordRef);
您正在发布一些不应该发布的内容。很久以后,当你这样做时:
CFRelease(allPeopleRef);
数组将尝试释放其所有记录,但不知道您已经释放了其中一些记录。结果是你的错误。通过注释掉该行,您可能已经使错误消失,但我担心您已经造成了内存泄漏。
我建议您不要在Get方法指针上调用CFRelease
,而是在Create或Copy上调用它方法指针(此规则可能有异常(exception),但到目前为止它对我有用)。
关于iPhone SDK : EXC_BAD_ACCESS with CFRelease for ABAddressBookRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1209130/
我正在使用以下代码在我的应用程序中初始化地址簿:- @property(nonatomic,assign) ABAddressBookRef addressBookRef; self.addressB
苹果说: Important: Instances of ABAddressBookRef can not be used by multiple threads. Each thread must
我有这个枚举地址簿联系人的代码 - +(void)enumerateAddressBookContacts:(void(^)(NSString *name, NSArray *phoneNumbe
我想在 iPhone 应用程序之一中引用我的地址簿。我使用了下面的代码。但它显示[人数] = 0。 我的地址簿应用程序中有 3-4 个联系人,但 [人数] 返回零。 还有什么吗,我在这里失踪了吗? 代
我无法理解如何访问 ABAddressBookRef 中地址的属性。我用电话号码就可以了: ABMultiValueRef phoneNumberProperty = ABRecordCopyValu
我的代码有一个非常奇怪的错误。事实上,根本没有错误,只是调试器以“程序收到信号:“EXC_BAD_ACCESS””消息开始。谁能帮我?我非常困惑...谢谢。 -(NSString *)fullName
我正在解析 iOS 中的地址簿,但 Leaks 工具报告了很大的内存泄漏,我似乎无法找到问题所在 首先,我创建了地址簿。 ABAddressBookRef addressBook = ABAddres
这是我的代码,运行最后一行CFRelease(addressBook),程序崩溃!帮帮我~! ABAddressBookRef addressBook = ABAddressBookCreateWit
我已经在 ObjC 中收集了联系人的地址信息, ABMultiValueRef addressProperty = ABRecordCopyValue(contactRef, kABPersonAdd
在 ARC 下,我有一个 TableView Controller ,它从地址簿中读取每个显示的 TableView 单元格的数据。由于性能原因,我无法在每次调用 tableView:cellForR
GCD 是否确保在同一队列中工作的所有 block 始终在同一线程中工作? 如果我创建一个调度队列并向该队列发送 dispath_async block ,是否所有调度到该队列的 block 都在同一
我有这个代码: CFArrayRef contactsList = ABAddressBookCopyArrayOfAllPeople(addressBookRef); CFMutable
我有几行 Objective-C 代码,例如: ABAddressBookRef addressBook; CFErrorRef error = NULL; addressBook = ABAddre
我是一名优秀的程序员,十分优秀!