有趣的UITableView数据源行为

时间:2010-08-27 15:08:24

标签: iphone uitableview

所以我有这个非常基本的ipad视图控制器,我在同一视图中使用多个UITableView进行一些测试。我遇到的问题是当我选择一行时,它会抛出一个EXC_BAD_ACCESS,所以我打开堆栈记录并找到了这个

*** -[VCTables tableView:didSelectRowAtIndexPath:]: message sent to deallocated instance 0x4c0ad40

然后我开始查看我的代码,无法弄清楚是什么导致了它。我在我的视图控制器上有UITableViewDataSource和UITableViewDelegate,并且有所有适当的代码来处理索引处的选择行。它正确地绘制了表格,它似乎并没有像数据源那样打击自己。

我尝试在代码中构建UITableViews,也在Interface builder中构建。卸载并重新启动后,我重新下载并安装了XCode 3.2.3 SDK 4.0.2。我不能为我的生活看到我所遗忘的东西,但在做完之前的工作之后,我现在确信(我猜)这是一个代码问题而不是IDE,我只是不能睁大眼睛看到代码问题。

此外,只有一个表也会发生这种情况。对于2个表,无论我选择哪个表

,都会发生这种情况

这里有一些代码:

VCTables.h

#import <UIKit/UIKit.h>
@interface VCTables : UIViewController<UITableViewDelegate,UITableViewDataSource> {
    UITableView *table1;
    UITableView *table2;    
}
@end

VCTables.m

#import "VCTables.h"
@implementation VCTables
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 50;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 7;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = [[NSString alloc] initWithString:@"yourCell"];
    if(tableView.tag == 2000){
        [CellIdentifier release];
        CellIdentifier = [[NSString alloc] initWithString:@"myCell"];
    }
    UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    if(tableView.tag == 2000){
        [cell.textLabel setText:[NSString stringWithFormat:@"%d",indexPath.row]];
    }else{
        [cell.textLabel setText:[NSString stringWithFormat:@"%d%d",indexPath.row,indexPath.section]];
    }
    [CellIdentifier release];   
    return cell;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
    NSLog(@"selected"); 
}
- (void)viewDidLoad {
    [super viewDidLoad];
    table1 = [[UITableView alloc] initWithFrame:CGRectMake(20, 73, 320, 480) style:UITableViewStylePlain];
    table1.delegate=self;
    table1.dataSource=self;
    table1.tag=2000;
    [self.view addSubview:table1];
    table2 = [[UITableView alloc] initWithFrame:CGRectMake(483, 73, 320, 480) style:UITableViewStylePlain];
    table2.delegate=self;
    table2.dataSource=self;
    table2.tag=2000;
    [self.view addSubview:table2];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
    [super viewDidUnload];
}
- (void)dealloc {
    [super dealloc];
}
@end

我不确定它是否比这更基本。请告诉我一个非常明显的菜鸟错误,我必须停止在这里发布。提前致谢

1 个答案:

答案 0 :(得分:3)

  

消息发送到解除分配的实例0x4c0ad40

此错误表示您的VCTables实例已被释放。 UITableView仍然具有对它的引用(委托属性),因此它试图将消息发送到已发布的对象。常见的术语是僵尸。

为了进行调试,您应该了解如何为VCTables对象执行内存管理。它在哪里创建,谁拥有它?

如果您可以使用Apple的性能工具,请尝试使用僵尸工具找出VCTables对象的发布位置。