集合 <__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: 异常

如何解决 [__NSCFString _isResizable] 的运行时错误:无法识别的选择器发送到实例?

[__NSCFString objectAtIndex:]:无法识别的选择器发送到实例错误