Objective C: Я пытаюсь сохранить NSDictionary, который содержит примитивы и объект, но произошла ошибка, как только я попытался добавить пользовательский объект

#objective-c #encoding #save #nsdictionary #nscoding

#objective-c #кодирование #Сохранить #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];
  

Обратите внимание на объект box, который я создал сверху и добавил в 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:
  

Любая помощь была бы с благодарностью!!!!

Комментарии:

1. Соответствует ли ваш класс BOX протоколу NSCoding (с поддержкой архивирования с ключом)

Ответ №1:

Исключение сообщает вам, что оно пытается отправить -encodeWithCoder: вашему Box экземпляру. Если вы посмотрите документацию, вы можете увидеть, что это относится к NSCoding протоколу. NSCoding используется NSKeyedArchiver для кодирования объектов. NSDictionary реализация NSCoding NSCoding требует, чтобы все ключи и объекты внутри него также соответствовали, ,,. В вашем случае все предыдущие значения, сохраненные в вашем словаре, соответствуют NSCoding , но ваш Box экземпляр не соответствует.

Вам нужно реализовать -initWithCoder: и -encodeWithCoder: в вашем Box классе, а затем объявить, что ваш класс соответствует NSCoding , изменив объявление, чтобы оно выглядело как

 @interface Box : Superclass <NSCoding>
  

Ответ №2:

Ваш пользовательский класс Box должен соответствовать NSCoding протоколу. Документация по протоколу находится здесь. У Рэя Вендерлиха есть хороший учебник здесь.