NSMutableArray 有错误空数组
Posted
技术标签:
【中文标题】NSMutableArray 有错误空数组【英文标题】:NSMutableArray have error empty array 【发布时间】:2013-06-21 09:42:38 【问题描述】:我对 NSMutablearray 和 JSON 解析有一些问题。 那我在做什么?从 JSON 解析并发送到我的 TableViewCell。 我有我的代码:
h:
NSMutableData *webdata;
NSURLConnection *connection;
NSMutableArray *array;
NSMutableArray *array2;
NSTimer *timer;
米:
[super ViewDidload]
[[self tableTrack] setDelegate:self];
[[self tableTrack] setDataSource:self];
array = [[NSMutableArray alloc] init];
array2 = [[NSMutableArray alloc] init];
timer = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(plistGet) userInfo:nil repeats:YES];
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
[webdata setLength:0];
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
[webdata appendData:data];
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
NSLog(@"error load");
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
NSDictionary *allDataDictionary = [NSJSONSerialization JSONObjectWithData:webdata options:0 error:nil];
NSDictionary *playlist =[allDataDictionary objectForKey:@"playlist"];
for (NSDictionary *diction in playlist)
NSDictionary *artist = [diction objectForKey:@"artist"];
NSDictionary *song = [diction objectForKey:@"song"];
NSString *name = [artist objectForKey:@"name"];
NSString *namesong = [song objectForKey:@"name"];
[array addObject:name];
[array2 addObject:namesong];
[[self tableTrack]reloadData];
-(void)plistGet
[array removeAllObjects];
[array2 removeAllObjects];
NSURL *url = [NSURL URLWithString:@"http://plist.json"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
connection = [NSURLConnection connectionWithRequest:request delegate:self];
if (connection)
webdata = [[NSMutableData alloc]init];
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [array count];
// return [array2 count];
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(! cell)
cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]autorelease];
cell.textLabel.text = [array2 objectAtIndex:indexPath.row];
cell.detailTextLabel.text = [array objectAtIndex:indexPath.row];
cell.textLabel.textColor = [UIColor colorWithRed:(50/255.0) green:(200/255.0) blue:(255/255.0) alpha:1];
[tableTrack setBackgroundView:nil];
tableTrack.backgroundColor = [UIColor clearColor];
cell.detailTextLabel.font=[UIFont fontWithName: @"Helvetica" size:11];
UIFont *myFont = [ UIFont fontWithName: @"Arial" size: 9.0 ];
cell.textLabel.font = myFont;
self.tableTrack.separatorStyle = UITableViewCellSeparatorStyleNone;
UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(0, 43, 1024, 1)];
separatorView.layer.borderColor = [UIColor darkGrayColor].CGColor;
separatorView.layer.borderWidth = 0.5;
[cell.contentView addSubview:separatorView];
return cell;
一切运行良好,但 5 或 3 分钟后出现错误,我的应用程序崩溃了。
错误:
2013-06-21 12:32:41.502 EuropaPlusUA[651:707] * 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayM objectAtIndex:]: index 0超出空数组的范围' * 首先抛出调用栈: (0x353f188f 0x37798259 0x3533a9db 0xfa9d5 0x32e85efb 0x32e84fd9 0x32e84763 0x32e28f37 0x353501fb 0x32220aa5 0x322206bd 0x32224843 0x3222457f 0x3221c4b9 0x353c5b1b 0x353c3d57 0x353c40b1 0x353474a5 0x3534736d 0x36fe3439 0x32e53cd5 0xf8843 0xf87d0) 终止称为抛出异常
这是什么?请帮忙。
【问题讨论】:
【参考方案1】:您的问题是您可能会在 3-5 分钟后执行另一个 plistget
方法。该方法将丢弃数组中的所有对象。在加载数据和清除数组期间,表数据源为空,但是您试图从索引 0 获取此对象。这就是发生崩溃的原因。
然而,解决方案很简单。根本不要调用 removeAllObjects 方法。 只需将数组替换为您将检索的内容即可。
替换从服务器获取数据时需要执行的机制:
NSMutableArray *tempDataArray = [[NSMutableArray alloc] init];
//put retrieved data from your web call in the tempDataArray
array = tempDataArray;
【讨论】:
对不起,我有些不明白,我必须把这段代码放在哪里? 我用过 [array removeAllObjects];因为我不需要将信息连续添加到我需要将其作为替代品,例如只有 3 个单元格【参考方案2】:我认为唯一的 objectAtIndex 在这里。
cell.detailTextLabel.text = [array objectAtIndex:indexPath.row];
似乎数组被 plistget 清空了
[array removeAllObjects];
【讨论】:
【参考方案3】:Totumus Maximus 是对的。
如果您只是需要在清除数组和重新加载数据之间架起一座桥梁,为什么不尝试在新数据准备好之前不删除它们呢?然后替换它们
也可以先复制它们(比如 backUpArray 和 backUpArray2),然后在尝试加载单元格之前检查数组/array2 中是否有数据(类似于if([array count])
或if (array) ...
)。
如果数组中没有任何内容,请使用 [backUpArray lastObject]
为您提供一些数据(短暂?),直到重新加载数组。
【讨论】:
以上是关于NSMutableArray 有错误空数组的主要内容,如果未能解决你的问题,请参考以下文章