initWithCoder和initWithNibName

时间:2010-04-22 07:20:59

标签: iphone objective-c

我正在尝试在UITableViewController中编码一些数据状态。在第一次,我使用Nibname初始化对象没有任何问题。但是,当我在initWithCoder时,UITableViewController仍然加载,但当我点击一个单元格时,应用程序崩溃,调试器告诉我EXEC_BAD_ACCESS,我的内存有问题,但我不知道

这是我的代码:

- (id) init {
    if(self = [self initWithNibName:@"DateTableViewController" bundle:nil]) {        
        self.dataArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil];
    }
    return self;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

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

    // Set up the cell...
    int index = indexPath.row;
 cell.textLabel.text = [self.dataArray objectAtIndex:index];;
    return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    return @"Test Archiver";
}
- (void)encodeWithCoder:(NSCoder *)coder {
    [super encodeWithCoder:coder];
    [coder encodeObject:self.dataArray];
}
- (id)initWithCoder:(NSCoder *)coder {
 return [self init];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    int index = indexPath.row;
    [self.dataArray addObject:[NSString stringWithFormat:@"Hello %d", index]];
    [self.tableView reloadData];
}

2 个答案:

答案 0 :(得分:1)

我在这里看到两个问题:

1)您正在使用dataArray序列化encodeObject:,但在initWithCoder:

中省略反序列化NSKeyedArchiver

2)您应该使用encodeObject:forKey:的方法{{1}}。然后您可以自由地在解码中使用序列化信息。

除此之外,我只能说回答你的问题,包含崩溃发生地点的信息会很有帮助。

答案 1 :(得分:1)

此代码中只有一个内存问题:在init中,您正在泄漏NSMutableArray。但这是你正在寻找的相反问题。您描述的错误不在发布的代码中。