4

NSKeyedArchiver で生成された plist である OS X アプリケーションからプロジェクト ファイルを取得しました。その中の 1 つの文字列をプログラムで変更する必要があります。

基本的に、Foundation クラスを含む NSDictionary オブジェクトが含まれています。ただし、1 つのカスタム クラス (GradientColor) があります。私はそれを自分で定義し、initWithCoder: と encodeWithCoder: で何もしようとしませんでしたが、新しく生成されたプロジェクト ファイルを読み取ろうとしてターゲット アプリケーションがクラッシュします。そのため、初期化時に nil 値を適切に処理できません。

クラスを initWithCoder:(NSCoder *)aDecoder で初期化して変更せずにエンコードするときに、どのキーがクラスに対応しているかをどうにかして知ることができますか?

4

1 に答える 1

1

そのクラス (GradientColor) の実装を復元しました。実際には、非常に少量のデータを保存します。

@interface GradientColor : NSView <NSCoding> {
    float location;
    NSColor *color;
}
@end

@implementation GradientColor
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeFloat:location forKey:@"location"];
    [aCoder encodeObject:color forKey:@"color"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        location = [aDecoder decodeFloatForKey:@"location"];
        color = [aDecoder decodeObjectForKey:@"color"];
    }
    return self;
}
@end

私のバージョンは何もしませんが、元の実装として正しくシリアル化および逆シリアル化します。plist自体で必要なキーとそのタイプを調べました。これで、CLI ユーティリティが有効なプロジェクト ファイルを生成します。

ここで、NSKeyedArchive の内部構造に関する良い記事を見つけました。使い方/

于 2013-08-22T20:08:25.643 に答える