的UITableView给错误
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//NSLog(@"Array: %@",rows);
return [rows count];// AT THIS LINE
}
程序接收到的信号:“EXC_BAD_ACCESS”的UITableView给错误
THANKS FOR其实我把它连接到的网页通过NSURL我在那里做了一个PHP数组,我创建了一个NSLog的,我的答复 我得到的数组形式的值,但当它优于行返回[rows count] ;.当我静态写入return 2;
然后执行时,它会发生错误。我正在向你解释我在做什么。我与
Name tableViewController=[[JsonTestViewController alloc] initWithNibName:@"JsonTestViewController" bundle:nil];
初始化笔尖在JsonTestViewController.m
我有这样的代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//NSLog(@"Array: %@",rows);
return [rows count];
}
// 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:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
// Configure the cell.
NSDictionary *dict = [rows objectAtIndex: indexPath.row];
NSString *strlb1=[dict objectForKey:@"block"];
NSString *strlb2=[dict objectForKey:@"name"];
strlb1=[strlb1 stringByAppendingString:@" , "];
strlb1=[strlb1 stringByAppendingString:strlb2];
NSString *[email protected]"FPS : ";
NSString *str2=[dict objectForKey:@"p_hours"];
NSString *strpinf;
if([str2 isEqualToString:@"FP"])
{
[email protected]"Free Parking";
}
else if([str2 isEqualToString:@"12"])
{
[email protected]"2 hours";
}
else if([str2 isEqualToString:@"14"])
{
[email protected]"4 hours";
}
else if([str2 isEqualToString:@"MP"])
{
[email protected]"Metered Parking";
}
str1=[str1 stringByAppendingString:strpinf];
cell.textLabel.text =strlb1;
cell.detailTextLabel.text = str1;
return cell;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL URLWithString:@"SITE URL"];
NSString *jsonreturn = [[NSString alloc] initWithContentsOfURL:url];
NSData *jsonData = [jsonreturn dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSError *error = nil;
NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
if (dict)
{
rows = [dict objectForKey:@"users"];
}
NSLog(@"Array: %@",rows);
[jsonreturn release];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
你可以给更多的信息?这可以是任何事情,但最有可能的是,行被指向有效数组曾经存在的内存。你是如何创建行数组的?
例如,如果通过另一种方法中的工厂方法将行数组创建为自动释放对象,则您的行数组或字典不再指向有效内存。
这里还有一个问题,这是非常接近你描述:
EXC_BAD_ACCESS signal received
编辑:
所以看你提供的代码,这些线路也有一些可能性:
NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
if (dict) { rows = [dict objectForKey:@"users"]; }
deserializeAsDictionary方法可以返回自动释放字典或NULL。所以有一种可能性是rows = NULL。当你尝试[行数]时,你的程序会崩溃。检查并看看有什么错误,可能会给你一些线索。
即使您明确返回2作为numberOfRowsInSection:
,也会导致错误,因为在cellForRowAtIndexPath:
中,您仍然尝试访问行,即使它可能为NULL。
另一种可能性在于您如何定义行。我猜这是你班上的一个财产。但是,如果您有rows=[dict objectForKey:@"users"];
,那么在方法完成后,行可以不指向任何内容。行将仍然具有[dict objectForKey:]所在的地址,但是在该方法的作用域之后,dict可能会消失,并且所有数据都会随之而来。
NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
根据KVC指南,您应该期望字典在方法结束后自动释放。
另一种可能性是,因为我不知道您使用的JSON类的细节,因此当您释放jsonreturn时,您还将释放与其关联的所有数据。所以实际上,行没有指向任何东西。
这种情况下,错误似乎根植于您如何设置/保留/访问行。
尝试使用Build-> Build &在xcode中分析。它可能会给你一些更多的提示。或者全部投掷一堆NSLog(@"%d",[rows count]);
。也尝试使用调试器。它会给你一些导致[行数]错误的方法调用。
感谢您的回复。但我已经检查了你已经给出的选项。当我写回归时,它崩溃[rows count];而不是返回1,2;当我写入类型return 2;代码在[UITableView layoutSubviews]中给出错误。但我已经检查NSLog行作为数组返回,并且数组数为10.请让我知道我在做什么错误错误消息我得到的是
在此先感谢 – IPhoneCrazy 2009-10-14 10:23:28
你可以请发表代码创建行吗?它看起来像你没有保留行,并且在调用-tableView:numberOfRowsInSection:时,行已经被自动释放。 – 2009-10-13 06:16:56
我已发布代码 – IPhoneCrazy 2009-10-14 07:44:01