0

私は Objective-C を初めて使用し、テーブルに新しい行を追加しようとして多くの問題を抱えています。それが機能すると想定される方法は、アプリがアラートをロードすると、新しい構成を開始するか、保存された構成をロードするか、最後の構成を再開するかをユーザーに尋ねるポップアップが表示されます。新しい構成の開始を選択すると、新しい名前を入力するように求められます。完了をタップすると、アプリは新しい構成をテーブルに保存します。

現在、テーブルに 1 つの構成のみを保存するようにアプリを取得することしかできませんが、ユーザーが別の新しい構成を作成しようとすると、アプリがクラッシュします。私のコードは次のようになります。

- (IBAction) testToAddToList
{
    nameOfConfig = @"Test Name"; //this just bypasses the user from having to enter a name

    NSMutableArray *array = [[NSMutableArray alloc] init];

    [array insertObject:nameOfConfig atIndex:configListDataIndex];

    self.configListData = array;

    [array release];

    configListDataIndex ++;
}

私はこのことについて多くのことを読んできましたが、これは難しすぎるべきではないようです. また、主な問題は、「配列」にはインデックスが 1 つしかなく、ユーザーが別のインデックスを追加しようとすると、アプリがクラッシュすることだと思います。

誰かが私を助けて、私が間違っていることと、どうすれば正しくできるか教えてもらえますか? お願いします!...それとも、私を正しい方向に向けるだけですか?

4

2 に答える 2

2

Woofy が言及しているように、問題は、以前に作成した配列を取得するのではなく、毎回新しい配列を作成していることです。したがって、配列に初めて追加するときは、基本的に次のことを行います。

[array insertObject:nameOfConfig AtIndex:0];

しかし、次回はまったく新しい (空の) 配列を作成し、configListDataIndex 変数は 1 になっているので、次のように呼び出します。

[array insertObject:nameOfConfig atIndex:1];

1 は空の配列の範囲外であるため、クラッシュします。これを解決するには、次のようにします。

NSMutableArray *array;
if (self.configListData != nil)  // I know, unnecessary, but I like being explicit with my nil checks.
    array = self.configListData;
else
    array = [NSMutableArray array];

次に、関数の最後で解放しないでください(configListDataのゲッターが自動解放または割り当てであると想定しているため)。

これでクラッシャーが修正されます。さらに、いつでも呼び出すことができます

[array addObject:nameOfConfig];

これにより、配列の最後にオブジェクトが自動的に追加されるため、インデックス変数を取り除くことができます。ただし、最初にクラッシャーを修正する必要があります。この 2 番目の部分を変更するとバグが隠され、新しい構成が古い構成を置き換えるだけであることがさらに不可解になります。

于 2009-09-19T17:13:31.070 に答える
2

insertObject の代わりに NSMutableArray の -addObject: メソッドを使用する方がはるかに簡単ではないでしょうか? addObject:nameOfConfig:

[array addObject:nameOfConfig];
self.configListData = array;
[array release];

以上です。

そして、なぜそれがクラッシュするのか知っていると思います...常に新しい配列オブジェクトを作成し、常に新しい空の配列の別の場所に「nameOfConfig」を挿入します。そのため、configListData には常に 1 つのオブジェクトしかありません。configListData を直接編集したほうがよいのではないでしょうか?

于 2009-09-18T20:57:28.560 に答える