[ios]addObject: NSMutableArray 和发送到表

发布时间: 2017/3/27 20:06:50
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

Xcode 4.2 iPhone 项目

我试图从 NSMutableArray 创建填充的表。目前当我运行模拟器问题表显示 5 行 (这是正确的),但所有行有相同的字符串 (这显然是不正确)。正在显示的字符串是从我的 NSMutableArray 中定义的最后一个对象。下面是代码︰

- (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;
}

我希望这是痛苦明显比我更有经验的任何人...我已经很少。

解决方法 1:

您存储的确切的同一对象 5 倍到您的数组。你似乎是误会, -addObject: 将复制对象它是左撇子,但它不会。简单的解决办法就是改变你 -addObject: 线说

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

这,当然,假设你 TableList 类符合 <NSCopying> 。如果不是,你可能想要这样做。如果您不愿意支持复制在那个班级,然后你必须创建一个新的 TableList 对象每次。

此外,除非你使用ARC,你正在泄漏你 TableList 对象。


为了支持 -copy ,你必须符合 <NSCopying> ,这是一种Protocol,声明该方法 -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 属性是仅有的值在对象上,并认为只分配到的属性是适当的。如果你有需要复制过去的内部变量,你可以通过使用类似的埃法尔访问

newObj->ivar = copyIvar(self->ivar); // self->ivar is the same as just plain ivar
官方微信
官方QQ群
31647020