2

私がこれを持っているとしましょう:

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[@1] = @2;
dict[@3] = dict;

dict次のように呼び出してアーカイブします。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dict];

その後、後でアーカイブを解除します。

NSMutableDictionary *dict2 = [NSKeyedUnarchiver unarchiveObjectWithData:data]

問題はではdict2[@3]なくdict2、初期化されていない であり、入力NSDictionaryしたものを回復できなかったことです。これを回避する方法を知っている人はいますか? 前もって感謝します!

4

2 に答える 2

4

これは、Apple メーリング リスト ( http://lists.apple.com/archives/cocoa-dev/2007/May/msg00747.html ) でApple のエンジニアによって説明されていますNSMutableArray 。エレメント。

概要:

これは (おそらく - 私は調べていません) 再帰自体の問題ではなく、アーカイブ解除中に から新しいオブジェクトを返すことによって自分自身を置き換えるオブジェクトの問題initWithCoder:です。
...
要約すると、再帰参照を確実に行うことはできません。ただし、実際には、これらが発生し (NSView サブビュー/スーパービューの関係を考えてください)、物事がきしみます。そうでない場合もあり、何かがうまくいくかどうかを事前に知ることは不可能です。

クリス・ケイン
ココア・フレームワーク、Apple

于 2013-07-29T07:21:12.677 に答える
1

これが機能した場合、私は本当に驚くでしょう。dict[@3]=dict を設定すると、基本的に無限ループを与えて、無限に深い辞書を作成します。ディクショナリからデータを作成するとき、アプリケーションがクラッシュする前にユーザーの RAM が完全に空にならないように、無限のディクショナリを初期化されていないディクショナリに置き換えることで、それから保護しているようです。

コンソールで dict[@3] を出力しようとすると、アプリケーションはそれを出力しようとして無限にループし、しばらくして最終的にクラッシュするまで停止します。

したがって、辞書を辞書に保存する場合は、別の辞書を作成します。

于 2013-07-29T07:17:31.360 に答える