0

メソッド(以下に示す)を呼び出してファイルをディスクに書き戻すまで、すべてが正常にsaveFile機能していますが、そこでクラッシュします。私は何を間違っていますか?

これはviewDidLoad、ファイルを開く方法の一部であり、正常に機能します。

//Get The Path
[self initPath];

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];      

if (accountsArray == nil) {
    accountsArray = [[[NSMutableArray alloc]init] autorelease];
}

if (countArray == nil) {     
    countArray = [[[NSMutableArray alloc]init] autorelease];
}

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

次に、それをテーブルビューにロードします。次に、それにいくつかの新しいアイテムを追加します。これは正常に機能します。次に、このメソッドを呼び出して保存すると、クラッシュします。

-(void)saveFile {
    [dictionary setObject:accountsArray forKey:@"username"];
    [dictionary setObject:countArray forKey:@"count"];
    [dictionary writeToFile:accountsFilePath atomically:YES];   
}
4

4 に答える 4

1

あなたは自動解放中countArrayで、accountsArrayそれらを初期化した直後です。それらを保存しようとすると、それらはすでに解放されている可能性があります。両方の にコメントautoreleaseを付けてみてください (メソッドのどこかでリリースすることを忘れないでくださいdealloc)。

于 2009-07-15T03:33:15.520 に答える
0

// パスが見つからず、ファイルがロードされず、辞書が nil の場合

dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:accountsFilePath];

// 初めて accountsArray、countArray を作成するとき

if (accountsArray == nil) {
    accountsArray = [[[NSMutableArray alloc]init] autorelease]; }

if (countArray == nil) {     
    countArray = [[[NSMutableArray alloc]init] autorelease]; }

// なぜまた新しいものに accountsArray を割り当てるのですか? 初期化したばかりの古いものはどうしますか?

// 辞書が nil の場合、countarray も nil になります

countArray = [dictionary objectForKey:@"count"];
accountsArray = [dictionary objectForKey:@"username"];

//// //// //////////////////////////////////////// //////////////////////

あなたのクラッシュメッセージは何ですか?

あなたのアカウントファイルパスは何ですか

辞書ファイルを読めますか?

あなたが知りたいかもしれない1つのこと

writeToFile は新しいフォルダーを作成しません

したがって、accountsFilePath 内のすべてのフォルダーが存在する必要があります。

それ以外の場合は、nsfilemanager を使用してそのフォルダーを作成することをお勧めします。

于 2009-07-15T06:59:47.180 に答える
0

おそらくすでにこれを行っていると思いますが、gdb でディクショナリと accountsFilePath を調べるか、writeToFile:atomically: 呼び出しの直前に NSLog を使用します。

このディクショナリに関して他に何が起こっているかを示すために、より多くの周囲のコードを共有することもできます。

私は NSZombie を使用しており、ランダム クラッシュのデバッグにも成功しています。

于 2009-07-15T02:42:53.613 に答える