1

だから私は「ボックス」と呼ばれるこのカスタムオブジェクトを作成しましたが、そのオブジェクトに対してエラーがスローされています。私の 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:

どんな助けでも大歓迎です!!!!

4

2 に答える 2

5

-encodeWithCoder:例外は、インスタンスに送信しようとしていることを示していBoxます。ドキュメントを調べると、これがNSCodingプロトコルに属していることがわかります。オブジェクトをエンコードするためにNSCoding使用されます。の の実装では、その中のすべてのキーとオブジェクトも に準拠する必要があります。あなたの場合、辞書に保存されている以前の値はすべて準拠していますが、インスタンスは準拠していません。NSKeyedArchiverNSDictionaryNSCodingNSCodingNSCodingBox

-initWithCoder:クラスにandを実装し、宣言を次のように変更して、クラスが準拠していることを宣言する必要があり-encodeWithCoder:ます。BoxNSCoding

@interface Box : Superclass <NSCoding>
于 2011-11-11T20:07:02.563 に答える
2

カスタム Box クラスはNSCodingプロトコルに準拠する必要があります。プロトコルのドキュメントはこちらです。Ray Wenderlich の優れたチュートリアルがここにあります

于 2011-11-11T20:06:45.947 に答える