我有个问题。我尝试将一个数组(名称: mps)中的项排序到另一个数组(名称: totalArray)中,但每个项都应该在一个新的数组中。简而言之: mps中的项应该移动到一个新的数组中,但每个项都应该在一个新的数组中,所以totalArray是一个数组的数组。在此之后,应该将totalArray复制回mps。
为了清楚起见,下面是代码:
NSMutableString *oud = [[NSMutableString alloc] init];
NSMutableString *nieuw = [[NSMutableString alloc] init];
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
[tempArray removeAllObjects];
NSMutableArray *totalArray = [[NSMutableArray alloc] init];
[totalArray removeAllObjects];
tempArray = [[NSMutableArray alloc] init];
[tempArray removeAllObjects];
for (int j = 0; j < [mps count]; j++)
{
nieuw = [[mps objectAtIndex:j] valueForKey:@"ConfigurationAlias"];
if (j != 0)
{
if ([oud rangeOfString:nieuw].location == NSNotFound)
{
NSLog(@"ADDED!");
[totalArray addObjectsFromArray:tempArray];
[oud setString:nieuw];
[tempArray removeAllObjects];
[tempArray addObject:[mps objectAtIndex:j]];
}
else
{
[tempArray addObject:[mps objectAtIndex:j]];
}
}
else {
[oud setString:nieuw];
[tempArray addObject:[mps objectAtIndex:j]];
}
}
//En de array weer laden in de tabel
//NSLog(@"%@", totalArray);
NSLog(@"%i", [mps count]);
[mps removeAllObjects];
NSLog(@"REMOVED!!!");
NSLog(@"%i", [mps count]);
[mps addObjectsFromArray:totalArray];
NSLog(@"Added totalArray: %i", [totalArray count]);
NSLog(@"%i", [mps count]);
[tempArray release];
[totalArray release];
[tabelView reloadData];}
现在,我的问题来了:
日志给出线路2011-04-07 10:02:46.368 Fleet Manager[901:40b] ADDED! 11次,然后发送16 (mps计数,这是正确的),然后是REMOVED!线路,然后是0 (mps计数,也是正确的),最后是线路: Added totalArray: 15。这不可能是正确的,它加了11次,但是它数了15次?
这对我来说是个问题,首先是因为它是完全不正确的,但是表视图也搞砸了,因为分区数量也不正确(15个分区)。有人知道这是怎么回事吗?
编辑: mps中的所有对象都是字典,并且都有一个键ConfigurationAlias的值。
发布于 2011-04-07 16:36:07
首先,我建议使用调试模式而不是一堆NSLog函数来跟踪对象和变量中实际发生的事情。尝试使用断点。为[totalArray addObjectsFromArray:tempArray];行设置1,这样每次到达此行代码时,执行都会停止,并允许您查看周围,检查totalArray和tempArray对象中不同字段的状态。
关于你的问题...由于您使用的是addObjectsFromArray:,这意味着传递的数组可能传递的不是一个对象,而是多个对象(因此方法名中的复数形式)。我猜"11次“中的一个添加了不止一个元素--这应该解释了实际的计数超过了你调用这个方法的次数。再次,请检查tempArray内容。
祝好运!
发布于 2011-04-07 16:38:24
如果你想得到一个数组的数组,你需要在循环中分配临时数组。看起来你在清理数组的时候也做得过火了。
似乎您试图将mps中的值添加到totalArray中,而不考虑条件,所以只在一个地方(条件之外)这样做是有意义的。
此外,如果您不改变数组(例如tempArray),则可以改用NSArray,它应该更小、更快。
最后,您应该能够将新数组分配给mps,而不是执行昂贵的数组复制。不过,我不确定是否以某种方式引用了表委托。
我会尝试这样的方法:
NSMutableString *oud = [[NSMutableString alloc] init];
NSMutableString *nieuw = [[NSMutableString alloc] init];
NSMutableArray *tempArray;
NSMutableArray *totalArray = [[NSMutableArray alloc] init];
for (int j = 0; j < [mps count]; j++)
{
tempArray = [[NSMutableArray alloc] init];
[totalArray addObject:tempArray];
[tempArray release];
nieuw = [[mps objectAtIndex:j] valueForKey:@"ConfigurationAlias"];
if (j != 0)
{
if ([oud rangeOfString:nieuw].location == NSNotFound)
{
NSLog(@"ADDED!");
[oud setString:nieuw];
}
}
else {
[oud setString:nieuw];
}
}
NSLog(@"%i", [mps count]);
[mps removeAllObjects];
NSLog(@"REMOVED!!!");
NSLog(@"%i", [mps count]);
[mps addObjectsFromArray:totalArray];
NSLog(@"Added totalArray: %i", [totalArray count]);
NSLog(@"%i", [mps count]);
[totalArray release];
[tabelView reloadData];
}发布于 2011-04-07 16:18:38
你应该
对tempArray
中忘记释放所有分配的临时数据
请查看以下内容,以便轻松排序:Sorting arrays via Apple
https://stackoverflow.com/questions/5577889
复制相似问题