所以我有这个非常基本的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
我不确定它是否比这更基本。请告诉我一个非常明显的菜鸟错误,我必须停止在这里发布。提前致谢
答案 0 :(得分:3)
消息发送到解除分配的实例0x4c0ad40
此错误表示您的VCTables实例已被释放。 UITableView仍然具有对它的引用(委托属性),因此它试图将消息发送到已发布的对象。常见的术语是僵尸。
为了进行调试,您应该了解如何为VCTables对象执行内存管理。它在哪里创建,谁拥有它?
如果您可以使用Apple的性能工具,请尝试使用僵尸工具找出VCTables对象的发布位置。