replaceObjectAtIndex数组问题

时间:2009-12-22 19:39:17

标签: iphone iphone-sdk-3.0 nsmutablearray

现在一直在寻找答案,我认为由于我的阵列设置的性质,我可能正在寻找错误的答案!

我有一个处理向我的数组添加项目的类:

// Item.h
@interface Item : NSObject {
    NSString *name;
    NSNumber *seconds;
}

@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSNumber *seconds;

- (id)initWithName:(NSString *)n seconds:(NSNumber *)sec;

@end

和...

//item.m

@implementation Item
@synthesize name, seconds;


- (id)initWithName:(NSString *)n seconds:(NSNumber *)sec {
    self.name = n;
    self.seconds = sec;
    return self;
}
@end

所以要添加一个项目,我使用

Item *item1 = [[Item alloc] initWithName:@"runnerA" seconds:[NSNumber numberWithInt:780]];

我有一些代码允许用户编辑文本字段(运行器名称)和UIdatepicker设置为小时和分钟的时间。在save方法中,这工作正常。这是我无法开展工作的更新。我尝试了很多!这是目前的代码......

mainAppDelegate *appDelegate = (mainAppDelegate *)[[UIApplication sharedApplication] delegate];    
Item *item = [[Item alloc] initWithName:inputName.text seconds:[NSNumber numberWithInt:secs]];
[appDelegate.arrItems replaceObjectAtIndex:rowBeingEdited withObject:item];

以上只是在数组中添加一个新项目(这是我不想要的)。我不确定如何替换值。在该函数中,我有我需要更新的行(rowBeingEdited),字段inputName.textsecs都可以。 (NSLog出来证实了这一点)。

如何使用replaceObjectAtIndex实际将其替换为值?!它现在让我发疯了!

2 个答案:

答案 0 :(得分:2)

由于您只是尝试编辑特定行,为什么不使用已在Item中设置的属性访问器?它看起来像这样:

Item *item = (Item *)[appDelegate.arrItems objectAtIndex:rowBeingEdited];
[item setName:inputName.text];
[item setSeconds:[NSNumber numberWithInt:secs]];

附注,您是使用垃圾收集,还是在向阵列添加项目时手动释放您创建的Item个对象?如果您手动执行此操作,它应如下所示:

Item *item1 = [[Item alloc] initWithName:@"runnerA"
                                 seconds:[NSNumber numberWithInt:780]];
[appDelegate.arrItems addObject:item1];
[item1 release];

这遵循经验法则:如果您alloccopyretain任何事情,您还必须release它。请注意,这是有效的,因为数组在添加时将保留该项目。

答案 1 :(得分:1)

  1. 您使用的是NSArray还是NSMutableArray
  2. 假设您使用的是NSMutableArray,那么您是如何初始化并首先填充数组的?
  3. 例如,仅使用仅留出空间的-initWithCapacity:+arrayWithCapacity:是不够的。您必须先使用-addObject:作为第一轮人口,然后才能使用-replaceObjectAtIndex:withObject:

    Note that NSArray objects are not like C arrays。也就是说,即使您在创建数组时指定了大小,指定的大小也会被视为“提示”;数组的实际大小仍为0.这意味着您无法在大于当前数组计数的索引处插入对象。例如,如果一个数组包含两个对象,其大小为2,那么您可以在索引0,1或2处添加对象。索引3是非法的并且超出范围;如果您尝试在索引3处添加对象(当数组的大小为2时),NSMutableArray会引发异常。