-1

次のコードを使用して辞書に値を書き込みましたが、辞書に新しい値を追加しても更新されない場合、最近追加された値のみを含むplistが表示され、クラッシュします。

nameString=nameTxt.text;
NSFileManager *mngr=[NSFileManager defaultManager];
NSArray *docDir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath=[docDir objectAtIndex:0];
NSString *filePath=[docPath stringByAppendingPathComponent:@"score.plist"];
NSString *bundlePath=[[NSBundle mainBundle] pathForResource:@"score" ofType:@"plist"];

if ([mngr fileExistsAtPath:filePath]) {
    NSLog(@"File exists");
}
else {      
    NSLog(@"NO file exists");
    [[NSFileManager defaultManager] copyItemAtPath:bundlePath toPath:filePath error:NULL];      
}   

dict=[[NSMutableDictionary alloc]init];
dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@"dict is %@",dict);
[dict setObject:nameString forKey:@"100"];
[dict writeToFile:filePath atomically:YES];

[dict release];

最後の行「[dictrelease]」を使用するとクラッシュします。バンドルにscore.plistファイルがあります。

4

2 に答える 2

0

これは単純な記憶の問題です。問題を解決するとともに、問題を理解する必要があります。

dictNSMutableDictionaryグローバルに宣言した です。そして、辞書のスコープを失わないように、これを使用するために割り当てることができるようにします。

したがって、最初に「ViewDidLoad:」と言うと、これを次のように割り当てて初期化できます

dict=[[NSMutableDictionary alloc]init];

または現在の状態では、次のように使用できます

dict=[[NSMutableDictionary alloc]initWithContentsOfFile: filePath];

score.plistファイルに辞書を割り当てることができるように、すべてが正常に機能します。

あなたの場合に起こったことは、dict. dictしかし、次の行では、次のステートメントで割り当てられたオブジェクトを自動解放されたオブジェクトに置き換えます

dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

クラス メソッドは常に自動解放されたオブジェクトを返すため、自動解放されたオブジェクトを解放しようとするとクラッシュします。:-)

あなたがアイデアを得たことを願っています。

今の解決策は、行を変更できることです

dict=[[NSMutableDictionary alloc]init];

dict=[[NSMutableDictionary alloc]initWithContentsOfFile: filePath];

そしてラインを外す

dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

すべてが機能します。ハッピーコーディング。:-)

于 2012-10-31T08:19:55.413 に答える
0

クラッシュはこの行によるものです。

dict=[[NSMutableDictionary alloc]init];
dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

最初の行でメモリを割り当ててから、自分が所有していない静的辞書にリンクするように dict パラメータを上書きしています。そのため、古いものがリークされ、解放するときに静的なものを解放しようとします。

その使用の代わりに、

dict=[NSMutableDictionary dictionaryWithContentsOfFile:filePath];

リリースステートメントを使用しないでください。あなたはそれを所有していないので、解放する必要はありません。

これをチェックして

于 2012-10-31T06:47:01.747 に答える