- (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;
然后执行时,它会出错。我正在向你解释我在做什么。我正在用
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
答案 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]);
。也尝试使用调试器。它会给你一些方法调用,导致[行数]错误。