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";

现在您刚刚更改了数据库中两条记录的内容——无需替换任何内容。你可以这样做的原因是它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 回答