目标C:我正在尝试保存包含基元和对象的NSDictionary,但是一旦我尝试添加自定义对象就会发生错误

Obj*_*ing 1 encoding objective-c save nsdictionary nscoding

所以我把这个自定义对象称为'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];
Run Code Online (Sandbox Code Playgroud)

请注意我在顶部创建的框对象,并在最后添加到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"];
}
Run Code Online (Sandbox Code Playgroud)

这是错误

-[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:
Run Code Online (Sandbox Code Playgroud)

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

Lil*_*ard 5

该例外告诉您它正在尝试发送-encodeWithCoder:到您的Box实例.如果查阅文档,可以看到这属于NSCoding协议.NSCoding用于NSKeyedArchiver编码对象.NSDictionary的实现NSCoding要求其中的所有键和对象也符合NSCoding.在您的情况下,存储在词典中的所有先前值都符合NSCoding,但您的Box实例不符合.

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

@interface Box : Superclass <NSCoding>
Run Code Online (Sandbox Code Playgroud)