的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 
+0

你可以请发表代码创建行吗?它看起来像你没有保留行,并且在调用-tableView:numberOfRowsInSection:时,行已经被自动释放。 – 2009-10-13 06:16:56

+0

我已发布代码 – IPhoneCrazy 2009-10-14 07:44:01

你可以给更多的信息?这可以是任何事情,但最有可能的是,行被指向有效数组曾经存在的内存。你是如何创建行数组的?

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

这里还有一个问题,这是非常接近你描述:

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]);。也尝试使用调试器。它会给你一些导致[行数]错误的方法调用。

+0

感谢您的回复。但我已经检查了你已经给出的选项。当我写回归时,它崩溃[rows count];而不是返回1,2;当我写入类型return 2;代码在[UITableView layoutSubviews]中给出错误。但我已经检查NSLog行作为数组返回,并且数组数为10.请让我知道我在做什么错误错误消息我得到的是 IPhoneCrazy 2009-10-14 10:22:44

+0

在此先感谢 – IPhoneCrazy 2009-10-14 10:23:28