我还有另一个问题,我相信我已经知道为什么它不起作用,但我不确定如何解决它......
我有一个使用MutableNSArray的数据库数组对象。我们称之为“数据库”。这是DatabaseRecord类型的对象数组。我还有另一个名为CurrentRecord的DatabaseRecord对象,它是我从用户界面操作的活动对象。当我在数据库中添加一个新条目时,我打电话给:
[Database addObject: CurrentRecord];
当我完成更改后,我用以下内容替换数据库中添加的记录:
[Database replaceObjectAtIndex: <index> withObject: CurrentRecord];
我刚才意识到,CurrentRecord是一个定义为:
的指针DatabaseRecord *CurrentRecord;
我相信发生的事情是数据库中的每个新条目都将自己设置为CurrentRecord的值。同样,当我更改CurrentRecord时,NSArray中的所有对象都会相应地修改自己,所以我留下了一个数据库,比如100条记录都是相同的。
我想要做的是将CurrentRecord的值复制到MutableNSArray中的相应对象中。
我确信有一个简单的解决方法,比如没有传递指针,但我不太清楚如何继续。我希望我的问题清楚......
答案 0 :(得分: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中引用对象的 only 方式是通过指针。但是修复并不困难 - 你只需要了解指针如何更好地工作。
答案 1 :(得分:1)
所以问题是NSArray中的一切都是一样的,对吧?您应该使用NSCopying协议和
[Database addObject: [CurrentRecord copy]];