是什么导致 NSUserDefaults 崩溃?

What is causing this crash in NSUserDefaults?

NSUserDefaults 的例行读取过程中,我们的用户群偶尔会发生崩溃。绝大多数用户不会遇到此问题,而遇到此问题的用户也不是 运行 任何特定版本的 iOS。它似乎只有在我们开始使用 Xcode 9.1.

进行部署后才出现
EXC_BAD_ACCESS KERN_PROTECTION_FAILURE 0x000000016efe3fc0

Crashed: com.apple.main-thread
0  libswiftCore.dylib             0x101816d4c @objc _NSContiguousString.length() + 5720
1  CoreFoundation                 0x181e2a168 CFStringCompareWithOptionsAndLocale + 96
2  Foundation                     0x1828602fc -[NSString isEqualToString:] + 76
3  CoreFoundation                 0x181e19558 CFEqual + 596
4  CoreFoundation                 0x181e15414 CFBasicHashFindBucket + 344
5  CoreFoundation                 0x181e152a0 CFDictionaryGetValue + 224
6  CoreFoundation                 0x181ef0c74 -[CFPrefsSearchListSource alreadylocked_copyValueForKey:] + 108
7  CoreFoundation                 0x181f8f224 -[CFPrefsSource copyValueForKey:] + 64
8  CoreFoundation                 0x181f992c0 __76-[_CFXPreferences copyAppValueForKey:identifier:container:configurationURL:]_block_invoke + 40
9  CoreFoundation                 0x181ef44f0 __108-[_CFXPreferences(SearchListAdditions) withSearchListForIdentifier:container:buttConfigurationURL:perform:]_block_invoke + 268
10 CoreFoundation                 0x181ef3d0c normalizeQuintuplet + 356
11 CoreFoundation                 0x181ef43d8 -[_CFXPreferences(SearchListAdditions) withSearchListForIdentifier:container:buttConfigurationURL:perform:] + 108
12 CoreFoundation                 0x181f99258 -[_CFXPreferences copyAppValueForKey:identifier:container:configurationURL:] + 124
13 CoreFoundation                 0x181f9bbbc _CFPreferencesGetAppBooleanValueWithContainer + 136
14 Foundation                     0x1828517a8 -[NSUserDefaults(NSUserDefaults) boolForKey:] + 112
15 <our code>                     0x100d80750 @objc SettingsPersistence.persistedBool.getter (SettingsPersistence.swift:90)

以下是我们如何检索值(Swift 3,通过 Objective C 调用):

fileprivate static let PersistedBoolKey = "persistedBool"

public var persistedBool: Bool {
    get {
        return UserDefaults.standard.bool(forKey: SettingsPersistence.PersistedBoolKey)
    }

    set(newPersistedBool) {
        UserDefaults.standard.set(newPersistedBool, forKey: SettingsPersistence.PersistedBoolKey)
    }
}

我认为这可能是线程问题,但这发生在主线程上。无论哪种方式,NSUserDefaults 都被记录为完全线程安全的。

在我看来,这像是 Apple 库中的一个低级错误。我该怎么做才能解决这个问题?我应该向谁报告?有没有其他人遇到过类似的问题?

谢谢!

自从 Xcode 升级到 9.4.1 后,此崩溃就消失了。