代码之家  ›  专栏  ›  技术社区  ›  eli

是什么导致了NSUserDefaults中的此崩溃?

  •  0
  • eli  · 技术社区  · 7 年前

    在从 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,通过目标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 记录为完全线程安全。

    在我看来,这就像苹果图书馆中的一个低级错误。我该怎么做才能解决这个问题?我应该向谁报告?还有其他人遇到过类似的问题吗?

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   eli    6 年前

    自从将Xcode升级到9.4.1之后,这个崩溃就消失了。