目标 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
协议。 NSCoding
被NSKeyedArchiver
用来编码对象。 NSDictionary
对NSCoding
的实现要求其中的所有键和对象也符合NSCoding
。在您的情况下,存储在字典中的所有先前值都符合 NSCoding
,但您的 Box
实例不符合。
您需要在您的Box
类上实现-initWithCoder:
和-encodeWithCoder:
,然后通过修改声明来声明您的类符合NSCoding
@interface Box : Superclass <NSCoding>
【讨论】:
【参考方案2】:您的自定义 Box 类必须遵守 NSCoding
协议。协议文档是here。 Ray Wenderlich 有一个很好的教程here。
【讨论】:
以上是关于目标 C:我正在尝试保存一个包含原语和对象的 NSDictionary,但是在我尝试添加自定义对象时发生错误的主要内容,如果未能解决你的问题,请参考以下文章