集合 <__NSCFString:> 在被枚举崩溃时发生了变异
Posted
技术标签:
【中文标题】集合 <__NSCFString:> 在被枚举崩溃时发生了变异【英文标题】:Collection <__NSCFString:> was mutated while being enumerated crash 【发布时间】:2014-07-04 08:14:27 【问题描述】:由于某种原因,我遇到了崩溃(如下所述),说“集合 <__nscfstring:> 在枚举时发生了变异”,但仅在实际设备上。它适用于 Xcode 测试设备。我不完全确定这意味着什么,那么我该如何处理这个 lldb 崩溃?
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, nil);
ABRecordRef pet = ABPersonCreate();
ABRecordSetValue(pet, kABPersonFirstNameProperty, (__bridge CFStringRef)petFirstName, nil);
ABRecordSetValue(pet, kABPersonLastNameProperty, (__bridge CFStringRef)petLastName, nil);
ABMutableMultiValueRef phoneNumbers = ABMultiValueCreateMutable(kABMultiStringPropertyType);
ABMultiValueAddValueAndLabel(phoneNumbers, (__bridge CFStringRef)petPhoneNumber, kABPersonPhoneMainLabel, NULL);
ABRecordSetValue(pet, kABPersonPhoneProperty, phoneNumbers, nil);
ABAddressBookAddRecord(addressBookRef, pet, nil);
NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBookRef);
for (id record in allContacts)
ABRecordRef thisContact = (__bridge ABRecordRef)record; //*******The line below is where the crash is occurring*********
if (CFStringCompare(ABRecordCopyCompositeName(thisContact),
ABRecordCopyCompositeName(pet), 0) == kCFCompareEqualTo)
//The contact already exists!
//detects if duplicate
return;
【问题讨论】:
那是确切的代码还是你试图删除欺骗或类似的? 你确定allContacts
是一个NSArray 吗?该消息表明它是一个 NSString。
不幸的是,这是我 Xcode 项目中的确切代码。
嗯...所以我没有分配 allContacts 什么的?
它仅在实际设备上失败。它适用于测试设备。我将把它添加到问题中。
【参考方案1】:
您正在应用程序的其他位置更改集合。根据苹果docs “在枚举可变集合时删除、替换或添加到可变集合的元素是不安全的” 请检查以下内容:
-
您在应用中使用哪些集合,可能是
在上面的代码运行时进行修改。
如果您需要修改任何
在迭代收集时,使用建议的技术
链接的文档。
【讨论】:
以上是关于集合 <__NSCFString:> 在被枚举崩溃时发生了变异的主要内容,如果未能解决你的问题,请参考以下文章
Swift Userdefaults 将 String 转换为 __NSCFString
[__NSCFString setView:]: 无法识别的选择器发送到实例 0x8292720
Swift - 无法将“__NSCFString”类型的值转换为“NSDictionary”
__NSCFString objectForKeyedSubscript: 异常