2

NSKeyedArchiver に問題があります。辞書をアーカイブしようとしています。辞書には、カスタム オブジェクトの配列、Album および Song が含まれています。

Album と Song はどちらも NSObject に固有であり、NSCoding プロトコルに準拠しています。プロトコルの実装方法は次のとおりです。

アルバム実装ファイル:

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];

    self.title = [aDecoder decodeObjectForKey:@"title"];
    self.artistName = [aDecoder decodeObjectForKey:@"artistName"];
    self.songs = [aDecoder decodeObjectForKey:@"songs"];

    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.title forKey:@"title"];
    [aCoder encodeObject:self.artistName forKey:@"artistName"];
    [aCoder encodeObject:self.songs forKey:@"songs"];
}

ソング実装ファイル:

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    self.title = [aDecoder decodeObjectForKey:@"title"];
    self.artistName = [aDecoder decodeObjectForKey:@"artistName"];

    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.title forKey:@"title"];
    [aCoder encodeObject:self.artistName forKey:@"artistName"];
}

title プロパティと artistName プロパティはどちらも NSStrings であり、白の song プロパティは Song オブジェクトの配列です。

これらのオブジェクトの配列を ipodDictForArchiving という辞書に配置し、次のように辞書をアーカイブします。

-(NSData *)dataForClient {
    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:[self ipodDictForArchiving] forKey:kDataArchive];
    [archiver finishEncoding];
    NSLog(@"encoded dictionary");
    return data;
}

次に、次のように辞書を解凍します。

-(NSDictionary *)unarchiveData:(NSData *)data {
    NSData *clientData = data;
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:clientData];
    NSDictionary *myDictionary = [unarchiver decodeObjectForKey:kDataArchive];
    [unarchiver finishDecoding];

    return myDictionary;
}

何らかの理由で、ディクショナリには Song オブジェクトと Album オブジェクトが含まれていますが、これらのオブジェクトはプロパティに対して null を返します。私はこれを理解することができません。

ありがとう

4

1 に答える 1

-1

initWithCoderを実装する方法が正しくないため、次のようになります。

- (id)initWithCoder:(NSCoder *)aDecoder {

    Album *al = [[Album alloc] init];

    al.title = [[[NSString alloc] initWithString:[aDecoder decodeObjectForKey:@"title"]] autorelease];
    al.artistName = [[[NSString alloc] init] initWithString:[aDecoder decodeObjectForKey:@"artistName"]] autorelease];
    al.songs = [[[NSArray alloc] initWithArray:[aDecoder decodeObjectForKey:@"songs"]] autorelease];

    return al;
}

ソングも同じです。

[編集]そして、アルバムをアーカイブする方法が正しくないようです。もっと簡単な方法を試してみましょう。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:album];

次に、このデータを保存して、後でアーカイブを解除できます。

于 2012-06-03T05:55:31.033 に答える