UITAbleView给出错误

时间:2009-10-13 06:00:58

标签: iphone-sdk-3.0

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 //NSLog(@"Array: %@",rows);
    return [rows count];// AT THIS LINE
}

编程收到信号:“EXC_BAD_ACCESS”

感谢回复 实际上我已经将它附加到WebPage由NSUrl,我已经创建了一个PHP数组,并且我已经创建了一个NSLOG,我在数组中获取了值,但是当它超出行返回[rows count];。当我静态写return 2;然后执行时,它会出错。我正在向你解释我在做什么。我正在用

初始化NIb
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 *str1=@"FPS : ";
    NSString *str2=[dict objectForKey:@"p_hours"];  
    NSString *strpinf;
    if([str2 isEqualToString:@"FP"])
    {
        strpinf=@"Free Parking";
    }
    else if([str2 isEqualToString:@"12"]) 
    {
        strpinf=@"2 hours";
    }
    else if([str2 isEqualToString:@"14"]) 
    {
        strpinf=@"4 hours";
    }
    else if([str2 isEqualToString:@"MP"]) 
    {
        strpinf=@"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

1 个答案:

答案 0 :(得分:0)

你可以提供更多信息吗?这可以是任何东西,但最有可能的是,行指向曾经是有效数组的内存。你是如何创建行数组的?

例如,如果通过另一种方法中的工厂方法将rows数组创建为自动释放对象,则行数组或字典不再指向有效内存。

这是另一个与你所描述的非常接近的问题:

EXC_BAD_ACCESS signal received

编辑:

所以看看你提供的代码,这些代码有一些可能性:

NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error]; 
    if (dict) { rows = [dict objectForKey:@"users"]; }

deserializeAsDictionary方法可以返回自动释放的字典或NULL。所以一种可能性是rows = NULL。当你尝试[行计数]时,你的程序会崩溃。检查并查看错误内容,可能会给您一些线索。

即使您为numberOfRowsInSection:明确返回2,也会导致错误,因为在cellForRowAtIndexPath:中,您仍在尝试访问行,即使它可能为NULL。

另一种可能性在于你如何定义行。我猜它是你班上的财产。但是如果你有rows=[dict objectForKey:@"users"];,那么在方法完成后,行可以指向任何内容。行仍将具有[dict objectForKey:]所在的地址,但在该方法的范围之后,dict可能会消失并且随附的所有数据。

NSDictionary * dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
根据KVC指南,你应该期待dict在方法结束后自动释放。

另一种可能性是,因为我不知道你正在使用的JSON类的细节,当你释放jsonreturn时,你也会释放所有与之相关的数据。所以实际上,行指向什么都没有。

例如,错误似乎植根于您设置/保留/访问行的方式。

尝试在xcode中使用Build-> Build& Analyze。它可能会给你一些提示。或者全押一堆NSLog(@"%d",[rows count]);。也尝试使用调试器。它会给你一些方法调用,导致[行数]错误。