当使用获取请求从核心数据实体获取数据时,我将从用户那里获得崩溃报告。这就是坠机的样子:
SIGABRT:未处理错误(NSCocoaErrorDomain,4864)发生在故障期间,并引发: error Domain=NSCocoaErrorDomain Code=4864“无法读取数据,因为数据格式不正确”。键‘/System/Library/PrivateFrameworks/UIFoundation.framework'.’的UserInfo={NSUnderlyingError=0x2822582d0 {Error Domain=NSCocoaErrorDomain Code=4864“值为意外类'NSTextAlternatives (0x1ffa90890)”允许的类是{( "NSTextAttachment (0x1ff3bc730) /System/Library/PrivateFrameworks/UIFoundation.framework",“(0x1ff35d8c8) /System/Library/Frameworks/Foundation.framework","NSDictionary (0x1ff352418) /System/Library/Frameworks/CoreFoundation.framework","NSFont (0x1ff3bc3e8) /System/Library/PrivateFrameworks/UIFoundation.framework","NSGlyphInfo (0x1ffa906d8) /System/Library/PrivateFrameworks/UIFoundation.framework","NSArray (0x1ff352238) /System/Library/Frameworks/CoreFoundation.framework",(0x1ff352238)“/System/Library/PrivateFrameworks/UIFoundation.framework",(0x1ff3bbec0) "NSUUID (0x1ff35f290) /System/Library/Frameworks/Foundation.framework","NSDate (0x1ff3522b0) /System/Library/Frameworks/CoreFoundation.framework","NSColor (0x1ff3a67a8) /System/Library/PrivateFrameworks/UIKitCore.framework","NSNull (0x1ff3527b0) /System/Library/Frameworks/CoreFoundation.framework","NSData (0x1ff3519c8) /System/Library/Frameworks/CoreFoundation.framework",“0x1ff3a6a78 /System/Library/PrivateFrameworks/UIKitCore.framework",”(0x1ff359c00) /System/Library/Frameworks/Foundation.framework","NSURL (0x1ff352e18) /System/Library/Frameworks/CoreFoundation.framework","NSSet (0x1ff352878) /System/Library/Frameworks/CoreFoundation.framework","NSValue (0x1ff35d940) /System/Library/Frameworks/Foundation.framework","UIFont (0x1ff3bc780) /System/Library/PrivateFrameworks/UIFoundation.framework",“/System/Library/Frameworks/Foundation.framework”(NSString (0x1ff35d170) )}“/System/Library/PrivateFrameworks/UIFoundation.framework'. (0x1ffa90890) UserInfo={键'NS.objects‘的NSDebugDescription=value为意外类'NSTextAlternatives’允许的类是{( "NSTextAttachment (0x1ff3bc730) /System/Library/PrivateFrameworks/UIFoundation.framework",“(0x1ff35d8c8) /System/Library/Frameworks/Foundation.framework","NSDictionary (0x1ff352418) /System/Library/Frameworks/CoreFoundation.framework","NSFont (0x1ff3bc3e8) /System/Library/PrivateFrameworks/UIFoundation.framework","NSGlyphInfo (0x1ffa906d8) /System/Library/PrivateFrameworks/UIFoundation.framework","NSArray (0x1ff352238) /System/Library/Frameworks/CoreFoundation.framework",(0x1ff352238)“/System/Library/PrivateFrameworks/UIFoundation.framework",(0x1ff3bbec0) "NSUUID (0x1ff35f290) /System/Library/Frameworks/Foundation.framework","NSDate (0x1ff3522b0) /System/Library/Frameworks/CoreFoundation.framework","NSColor (0x1ff3a67a8) /System/Library/PrivateFrameworks/UIKitCore.framework","NSNull (0x1ff3527b0) /System/Library/Frameworks/CoreFoundation.framework","NSData (0x1ff3519c8) /System/Library/Frameworks/CoreFoundation.framework",“0x1ff3a6a78 /System/Library/PrivateFrameworks/UIKitCore.framework",”(0x1ff359c00) /System/Library/Frameworks/Foundation.framework","NSURL (0x1ff352e18) /System/Library/Frameworks/CoreFoundation.framework","NSSet (0x1ff352878) /System/Library/Frameworks/CoreFoundation.framework","NSValue (0x1ff35d940) /System/Library/Frameworks/Foundation.framework","UIFont (0x1ff3bc780) /System/Library/PrivateFrameworks/UIFoundation.framework",“/System/Library/Frameworks/Foundation.framework”(0x1ff35d170) NSString)}‘}CrashVersion 5.6.8 (5.6.9)1份user1报告
当NSFetchedResultsController调用performFetch时,它会崩溃。
+ 152 9
7 CoreData 0x00000001b48c1a94 _43-NSFetchedResultsController performFetch:_block_invoke + 572 8 CoreData 0x0000001b487c01c
CoreData 0x00000001b474eda4 -NSManagedObjectContext performBlockAndWait:+ 204 10 CoreData 0x0000001b475cae4 -NSFetchedResultsController _recursivePerformBlockAndWait:withContext:+ 144 11 CoreData 0x00000001b475cc1c -NSFetchedResultsController performFetch:+ 220
这几乎可以肯定,因为我最近将一个可转换属性(它没有任何转换器集(基本上使用NSKeyedUnarchiveFromDataTransformerName) )更改为使用NSSecureUnarchiveFromDataTransformer的子类。该属性是在一个NSAttributedString应用程序中存储来自UITextView的一个iOS。我还将NSRange保存为“粗体”和“斜体”项,作为NSValue。
我添加了以下转换器:
@objc(AttributedStringDictionaryTransformer)
final class AttributedStringDictionaryTransformer: NSSecureUnarchiveFromDataTransformer {
override static var allowedTopLevelClasses: [AnyClass] {
return super.allowedTopLevelClasses + [NSValue.self]
}
}此“转换器”用于核心数据模型中的可转换属性。它将NSValue类添加到允许的类列表中。
当它说“key 'NS.objects‘的值属于意外的类'NSTextAlternatives’……我不知道NSTextAlternatives是什么。我从来没有(明确地)在我的代码中使用过它。有什么想法吗?”
编辑:在进一步的调查中,NSAttributedString可以对所有类型的对象进行修改,比如NSTextAlternatives和_UITextInputDictationResultMetadata的对象,如果用户在UITextView上使用听写,就可能会出现这些对象。因此,NSSecureUnarchiveFromDataTransformer在技术上支持NSAttributedString,实际上并不支持它。这些类来自私有框架,因此不确定如何将它们添加到自定义转换器中。除了提交错误之外,不确定是否有其他的工作。如果有,请告诉我。
发布于 2021-03-05 14:25:27
实际上,NSAttributedString可以是一些文本系统相关属性的抓取包:文本视图中的各种操作可能导致文本系统(CoreText、UIKit等)。用一些元数据对范围进行注释以改进iOS体验,但这确实意味着任何给定的NSAttributedString最终都会带来一些您可能不知道的负担。(从概念上讲,NSAttributedString就像一个带有关联NSDictionary的NSString,如果您斜视的话,它可以包含任何内容。)经常使用文本视图可能会导致这种情况,当您在粘贴其他属性字符串源的文本时,您可能会得到许多您不希望看到的属性值。这是文本系统按预期工作。
不幸的是,这个设计使用NSSecureCoding,它要求您在解码存档之前列出您希望从归档中解码的类型。您正确地白化了NSAttributedString和NSValue对象,NSAttributedString本身也显示了它知道的几种类型( NSSecureUnarchiveFromDataTransformer还允许一些已知的基金会类型),但问题是,字符串最终包含您和NSAttributedString都不知道的类型,如果不将这些类型白名单,解码将被阻止。
由于这些类型确实是私有的,所以您将很难找到文本系统可以抛给您的所有可能的私有类型。最简单的方法是在编码方面:在编码NSAttributedString之前,遍历它的所有属性范围,并剔除任何类型不符合白名单标准的属性。在编码时使用与解码时使用的相同标准将使您能够成功地解码。
https://stackoverflow.com/questions/66486524
复制相似问题