0

なぜ機能しないのかはすでにわかっていると思いますが、修正方法がわかりません...

MutableNSArrayを使用したデータベース配列オブジェクトがあります。それを「データベース」と呼びましょう。これは、DatabaseRecord型のオブジェクトの配列です。また、ユーザーインターフェイスから操作するアクティブオブジェクトであるCurrentRecordという別のDatabaseRecordオブジェクトもあります。データベースに新しいエントリを追加するときは、次のように呼び出します。

[Database addObject: CurrentRecord];

変更が完了したら、データベースに追加されたレコードを次のように置き換えます。

[Database replaceObjectAtIndex: <index> withObject: CurrentRecord];    

私が今気付いたのは、CurrentRecordは次のように定義されたポインターであるということでした。

DatabaseRecord *CurrentRecord;

何が起こっているのかというと、データベース内のすべての新しいエントリがCurrentRecordの値に設定されていると思います。同様に、CurrentRecordを変更すると、NSArray内のすべてのオブジェクトがそれに応じて変更されるため、たとえば、すべて同一の100レコードのデータベースが残ります。

私がやりたいのは、基本的にCurrentRecordの値をMutableNSArrayの適切なオブジェクトにコピーすることです。

ポインタを渡さないなど、これには簡単な修正があると確信していますが、どのように進めるかはよくわかりません。私の質問が明確になっていることを願っています...

4

2 に答える 2

3

変更が完了したら、データベースに追加されたレコードを置き換えます

すでに配列にあるレコードを変更する場合は、何も置き換える必要はありません。これを行う:

DatabaseRecord *currentRecord;

currentRecord = [database objectAtIndex:someIndex];
currentRecord.name = @"tom";
currentRecord.location = @"los angeles";

currentRecord = [database objectAtIndex:someOtherIndex];
currentRecord.name = @"harry";
currentRecord.location = @"new york";

これで、データベース内の2つのレコードの内容が変更されました。何も置き換える必要はありません。これを実行できる理由はcurrentRecord、既存のオブジェクトへの単なるポインタであるためです。

配列内のすべてのレコードを変更する場合は、次の操作を実行できます。

for (currentRecord in database) {
    // make changes to currentRecord here
    // no need to replace the record in the array -- it's already there!
}

一方、データベースに新しいレコードを追加する場合は、毎回新しいオブジェクトを作成する必要があります。これを行うには、既存のオブジェクトをコピーするか、自分で毎回新しいオブジェクトをインスタンス化します。

for (int i = 0; i < 10; i++) {
    currentRecord = [[DatabaseRecord alloc] init];
    [database addObject:currentRecord];
    // add [currentRecord release]; for non-ARC builds
}

また:

currentRecord = [[DatabaseRecord alloc] init];
for (int i = 0; i < 10; i++) {
    [database addObject:[currentRecord copy]];
    // make the previous line [database addObject: [[currentRecord copy] autorelease]]; for non-ARC builds
}

ARCを使用していない場合は、上記のコメントに示すように、作成したオブジェクトを適切に解放する必要があります。

ポインタを渡さないなど、これには簡単な修正があると確信しています

いいえ。Objective-Cでオブジェクトを参照する唯一の方法は、ポインタを使用することです。ただし、修正は難しくありません。ポインタがどのように機能するかを理解する必要があります。

于 2012-04-28T22:04:59.870 に答える
1

問題は、NSArrayのすべてが同じであるということですよね?NSCopyingプロトコル

[Database addObject: [CurrentRecord copy]];
于 2012-04-28T22:04:01.587 に答える