0

私はこのようにエンコードします:

NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];          
[archiver encodeObject:data forKey:@"Object"];
[archiver finishEncoding];

次に、保存したファイルをディスクから取得した後、次のようにデコードしようとします。

Object *object = (Object*)[unarchiver decodeObjectForKey:@"Object"];

問題は、これが Object* 型にデコードされないことです。NSMutableData のままです。したがって、「object.name」などのオブジェクトのプロパティにアクセスしようとすると、-[NSConcreteMutableData name]: unrecognized selector sent to instance 0x2c8510' が表示されます。

Ray Wenderlich のチュートリアルhttp://www.raywenderlich.com/1914/how-to-save-your-app-data-with-nscoding-and-nsfilemanagerに従いました。彼のコードは機能しますが、私のコードは機能しません。それで、これをいじって一日を過ごした後、私は助けを求めています。

4

2 に答える 2

2

あなたが引用したチュートリアルでは、クラスで「データ」と呼ばれるプロパティを使用し、saveData メソッドで「データ」と呼ばれる変数も使用します。彼は、encodeObject:. 彼は2つの異なるものに同じ名前を使用しているため、少し混乱しています.

あなた、otoh は、「data」という名前の ivar を作成し、それを encodeObject: に送信しています。Object* プロパティにアクセスすることはなく、空の NSMutableData を NSMutableData に書き込むだけです。違いはアンダースコアがないことですが、もっと良い方法があります。

エンコードしようとしているデータのプロパティの名前を、たとえば「info」に変更することをお勧めします (または、「stockPrices」や「todaysWeather」、またはこのクラスが保存しているデータなど、より有益なもの)

@property Object* info;

アクセサーの名前を適切に変更します(彼のやり方で物事を行っていると仮定します)

そして次のように書きます。

[archiver encodeObject:self.info forKey:@"Object"]

開発者としての利益のために、ここで 2 つのことが起こっています。エンコードされているデータとエンコードしている情報に異なる名前を使用しており、クラスの情報にアクセスしていることを示すコードを明示的に記述しています。プロパティであり、ローカル変数ではありません。これらはどちらも、6 か月後にこのコードを確認するときの作業を楽にしてくれます。

于 2012-04-11T14:48:19.230 に答える
1

dataではないエンコードを行っているためですobject。この行を変更します。

[archiver encodeObject:data forKey:@"Object"];

これに

[archiver encodeObject:object forKey:@"Object"];
于 2012-04-11T14:41:40.670 に答える