目标 C:我正在尝试保存一个包含原语和对象的 NSDictionary,但是在我尝试添加自定义对象时发生错误

Posted

技术标签:

【中文标题】目标 C:我正在尝试保存一个包含原语和对象的 NSDictionary,但是在我尝试添加自定义对象时发生错误【英文标题】:Objective C: I'm trying to save an NSDictionary that contains primitives and object, but error occurred once i tried adding the custom object 【发布时间】:2011-11-11 19:58:23 【问题描述】:

所以我有一个名为“Box”的自定义对象,它会为那个对象抛出错误。 我的 NSDictionary 里面是...

box = [[Box alloc] initWithHeight:20 height:40];    
wrap.dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:numberInt, kInt, numberShort, kShort, numberLong, kLong, numberFloat, kFloat, numberDouble, kDouble, numberBool, kBool, nsString, kString, nsDate, kDate, box, @"keybox", nil];

请注意我在顶部创建并在最后添加到 NSDictionary 中的 box 对象。在没有盒子之前,一切正常,但是当我添加自定义对象“盒子”时,它就无法保存了。

- (void) saveDataToDisk:(NSMutableDictionary *)dictionaryForDisk 

    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    //Encode 
    [archiver setOutputFormat:NSPropertyListBinaryFormat_v1_0];
    [archiver encodeObject:dictionaryForDisk forKey:@"Dictionary_Key"];

    [archiver finishEncoding];
    [data writeToFile:[self pathForDataFile] atomically:YES];


- (NSString *) pathForDataFile 
    NSArray*    documentDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString* path = nil;
    if (documentDir) 
    
        path = [documentDir objectAtIndex:0];    
    

    return [NSString stringWithFormat:@"%@/%@", path, @"data.bin"];

这是错误

-[Box encodeWithCoder:]: unrecognized selector sent to instance 0x4e30d60
2011-11-11 11:56:43.430 nike[1186:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Box encodeWithCoder:]: unrecognized selector sent to instance 0x4e30d60'
*** Call stack at first throw:

任何帮助将不胜感激!!!!

【问题讨论】:

你的 BOX 类是否符合 NSCoding 协议(支持 keyed-archiving) 【参考方案1】:

异常告诉您它正在尝试将-encodeWithCoder: 发送到您的Box 实例。如果您查找documentation,您可以看到它属于NSCoding 协议。 NSCodingNSKeyedArchiver 用来编码对象。 NSDictionaryNSCoding 的实现要求其中的所有键和对象也符合NSCoding。在您的情况下,存储在字典中的所有先前值都符合 NSCoding,但您的 Box 实例不符合。

您需要在您的Box 类上实现-initWithCoder:-encodeWithCoder:,然后通过修改声明来声明您的类符合NSCoding

@interface Box : Superclass <NSCoding>

【讨论】:

【参考方案2】:

您的自定义 Box 类必须遵守 NSCoding 协议。协议文档是here。 Ray Wenderlich 有一个很好的教程here。

【讨论】:

以上是关于目标 C:我正在尝试保存一个包含原语和对象的 NSDictionary,但是在我尝试添加自定义对象时发生错误的主要内容,如果未能解决你的问题,请参考以下文章

如何序列化包含指向原语的指针的类?

目标 C 视图控制器属性未保存

无法将视频保存到相机胶卷(目标 C)

从表视图中删除行时出现异常。 iOS 目标-C

iOS - 核心数据 - 保存包含对象数组的对象

Makefile 包含基于 Debug / Release 目标的依赖项