Цель C: я пытаюсь сохранить NSDictionary, который содержит примитивы и объект, но ошибка произошла, как только я попытался добавить пользовательский объект - PullRequest
1 голос
/ 11 ноября 2011

Так что у меня есть этот пользовательский объект, который я назвал «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 в самом конце.Раньше, когда коробки там не было, все работало нормально, но когда я добавил пользовательский объект «Коробка», он больше не мог сохранять.

- (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:

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

Ответы [ 2 ]

5 голосов
/ 12 ноября 2011

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

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

@interface Box : Superclass <NSCoding>
2 голосов
/ 12 ноября 2011

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

...