对象指针问题

时间:2012-04-28 21:42:38

标签: objective-c cocoa nsarray

我还有另一个问题,我相信我已经知道为什么它不起作用,但我不确定如何解决它......

我有一个使用MutableNSArray的数据库数组对象。我们称之为“数据库”。这是DatabaseRecord类型的对象数组。我还有另一个名为CurrentRecord的DatabaseRecord对象,它是我从用户界面操作的活动对象。当我在数据库中添加一个新条目时,我打电话给:

[Database addObject: CurrentRecord];

当我完成更改后,我用以下内容替换数据库中添加的记录:

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

我刚才意识到,CurrentRecord是一个定义为:

的指针
DatabaseRecord *CurrentRecord;

我相信发生的事情是数据库中的每个新条目都将自己设置为CurrentRecord的值。同样,当我更改CurrentRecord时,NSArray中的所有对象都会相应地修改自己,所以我留下了一个数据库,比如100条记录都是相同的。

我想要做的是将CurrentRecord的值复制到MutableNSArray中的相应对象中。

我确信有一个简单的解决方法,比如没有传递指针,但我不太清楚如何继续。我希望我的问题清楚......

2 个答案:

答案 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]];