addObject:到NSMutableArray并发送到TableView

时间:2012-01-11 20:17:59

标签: ios xcode nsmutablearray tableview

Xcode 4.2 iPhone项目

我正在尝试创建一个从NSMutableArray填充的tableView。目前,当我运行模拟器时,有问题的tableView显示5行(这是正确的)但所有行都有相同的字符串(这显然是不正确的)。显示的字符串来自我的NSMutableArray中定义的LAST对象。这是代码:

- (void)viewDidLoad
{

[super viewDidLoad];

codes = [[NSMutableArray alloc] init];
TableList *listItem = [[TableList alloc] init];

[listItem setCodeTitle:@"Test Name 1"];
[listItem setCodeNumber:@"101"];
[listItem setCodeDescription:@"This is the description for 101."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 2"];
[listItem setCodeNumber:@"102"];
[listItem setCodeDescription:@"This is the description for 102."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 3"];
[listItem setCodeNumber:@"103"];
[listItem setCodeDescription:@"This is the description for 103."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 4"];
[listItem setCodeNumber:@"104"];
[listItem setCodeDescription:@"This is the description for 104."];
[codes addObject:listItem];

[listItem setCodeTitle:@"Test Name 5"];
[listItem setCodeNumber:@"105"];
[listItem setCodeDescription:@"This is the description for 105."];
[codes addObject:listItem];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//#warning Potentially incomplete method implementation.
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//#warning Incomplete method implementation.
// Return the number of rows in the section.
return [codes count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CodeCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// Configure the cell...
TableList *current = [codes objectAtIndex:indexPath.row];
cell.textLabel.text = [current codeTitle];

return cell;
}

我希望对于比我更有经验的人来说,这是非常明显的......我很少。

2 个答案:

答案 0 :(得分:3)

您将完全相同的对象存储在阵列中5次。你好像误以为-addObject:会复制它所交给的对象,但事实并非如此。简单的解决方法是将-addObject:行更改为

[codes addObject:[[listItem copy] autorelease]];

这当然是假设您的TableList类符合<NSCopying>。如果没有,你可能想要这样做。如果您不愿意支持在该课程中进行复制,那么您每次都必须创建一个新的TableList对象。

此外,除非您使用ARC,否则您将泄露TableList对象。


为了支持-copy,您必须符合<NSCopying>,这是一个声明方法-copyWithZone:的协议(虽然区域参数是一个应该被忽略的历史好奇心) 。为此,请将@interface行修改为

@interface TableList : NSObject <NSCopying>

然后实现方法-copyWithZone:

- (id)copyWithZone:(NSZone *)zone {
    // If our superclass conformed to <NSCopying> we'd call [super copy]
    // But it doesn't, so alloc/init a new instance
    TableList *newObj = [[TableList alloc] init];
    newObj.codeTitle = self.codeTitle;
    newObj.codeNumber = self.codeNumber;
    newObj.codeDescription = self.codeDescription;
    return newObj;
}

这只是一个示例实现。它假定这3个属性是对象上的唯一值,并且只是分配给属性是合适的。如果你有需要复制的内部ivars,你可以通过使用类似

的方式获得ivar访问权限
newObj->ivar = copyIvar(self->ivar); // self->ivar is the same as just plain ivar

答案 1 :(得分:0)

此外,如果您使用的是NSMutableArray,请尝试将其链接到NSArray。