0

いくつかのデータを含む UITableView があります。すべてのセルにはボタンがあり、それを押すと選択したセルが削除されます。その後、データを NSUserDefault で保存する必要があります。ここにいくつかのコード:

- (void)buttonPressed:(UIButton *)sender{   
    int tag=sender.tag;
    [myArray removeObjectAtIndex:tag];

    [self saveData];
    [self.myTableView reloadData];  
}

メソッドは次のbuttonPressedメソッドを呼び出しますsaveData

-(void)saveData{
    dataString=[[NSString alloc]init]; //defined in .h file

    for(int i=0; i<([myArray count]); i++){
        ClassObject *aObject=[[ClassObject alloc]init];
        aObject=[myArray objectAtIndex:i];
        dataString=[dataString stringByAppendingString:aObject.idObject];
        dataString=[dataString stringByAppendingString:@"$"];
        dataString=[dataString stringByAppendingString:aObject.description1];
        dataString=[dataString stringByAppendingString:@"$"];
        dataString=[dataString stringByAppendingString:aObject.description2];
        dataString=[dataString stringByAppendingString:@"?"];
        [aObject release];
    }


    NSUserDefaults *dataDefault=[NSUserDefaults standardUserDefaults];
    [dataDefault setObject:dataString forKey:@"myDataString"];
    [dataDefault synchronize];
    [dataString release];
}

saveDataデバッグモードでは、メソッドが終了するまですべてがうまくいきます。メソッドでデバッグが返されるbuttonPressedと、テーブルビューがリロードされ、アプリがクラッシュします。理由はわかりません。

いくつかのアイデア?ありがとう。

4

4 に答える 4

1

aEquipaggioあなたのsaveDataアプリのどこから来たのですか?ループの各反復でそれを解放するのはなぜですか? それは意味がなく、過剰にリリースされている可能性が非常に高く、後でクラッシュを引き起こします。

編集:質問のコードを変更したので、aEquipaggioもうありませんが、ループの最後の行はまだ正しくありません。ループの最初の行は、インスタンスをrelease使用しないため、まったく無意味です(そしてリークします) 。ClassObject割り当てる。

dataStringまた、メソッドの最後で解放するべきではありません。その時点で、ループ内で自動解放されたインスタンスに置き換えたため、最初に編集したdataStringのと同じインスタンスは含まれていませんallocinit[[NSString alloc]init]とにかく無意味です。使用して@""ください)。

于 2013-05-24T09:12:05.303 に答える
1
ClassObject *aObject=[[ClassObject alloc]init];
aObject=[arrayEquipaggio objectAtIndex:i];
// ...
[aObject release];

まず、そして最も重要なことは、むしろanObject.

[arrayEquipaggio objectAtIndex:i];第 2 に、これはメモリ リーク (変数に再割り当てすると、割り当てられたインスタンスへのポインターを失う)過剰解放aObject(先ほど説明したように、配列内のオブジェクトを指すため、所有していないオブジェクト)。

全体として、alloc-init の行と release の行を削除します (変数でも同じ間違いを犯しdataStringます)。

開発を続ける前にこれを読んでください!そうしないと、Objective-C で何かを行うのに深刻な問題が発生します。現在、メモリ管理がどのように機能するかについてはまったくわかっていないようです。(Objective-C を使おうとする前に C を学ぶことも価値がありますが、残念ながらそれはあまりにも大きな期待であることがわかりました...)

于 2013-05-24T09:13:41.947 に答える
1

You’ve got the memory allocation wrong. This is what you’re doing:

dataString = [[NSString alloc] init];
dataString = [dataString stringByAppendingString:@"$"];
[dataString release];

First you allocate a new string that you have to release later. That’s OK. Then you store a different pointer into the dataString variable, leaking the previous string. And then you release the autoreleased string created by -stringByAppendingString, so that the object gets over-released soon after that.

于 2013-05-24T09:14:22.547 に答える
0

ワイルドな推測ですが、おそらく のリリースと関係がありdataStringます。最適化してみてください。

于 2013-05-24T09:12:01.007 に答える