在尝试将对象添加到可变数组时,我似乎遇到了一个奇怪的问题。问题是我有一个带有坐标的字典数组,我从外部数据库获取并尝试循环遍历它们,提取坐标,创建自定义注释对象,然后将其添加到可变数组中。
问题是我得到的数组显示它只有1个对象而第一个数组有5个。
请帮忙!
这是代码(注释:testArray是我班上的一个属性,我不创建它,我只是尝试用它来存储对象)
谢谢!
int times; int count;
count=[theResults count];
// do the loop oh yeah do the loop
for (times=0;times<count; times=times+1)
{
// create dictionary with contents of array
NSDictionary * testDict = [theResults objectAtIndex:times];
NSLog(@"the results has %i objects", [theResults count]);
NSLog(@"object latitude is %@",[radarDict valueForKey:@"radarLatitude"]);
NSLog(@"object longitude is %@", [radarDict valueForKey:@"radarLongitude"]);
double testLatitude=[[radarDict valueForKey:@"radarLatitude"] doubleValue];
double testLongitude=[[radarDict valueForKey:@"radarLongitude"] doubleValue];
CLLocationCoordinate2D testCoordinate;
testCoordinate.longitude=testLongitude;
testCoordinate.latitude=testLatitude;
CustomAnnotations* tempAnnotation = [[CustomAnnotations alloc] initWithLocation:testCoordinate];
testArray = [[NSMutableArray alloc] initWithCapacity:count];
[testArray addObject:tempAnnotation];
[tempAnnotation release];
}
答案 0 :(得分:1)
您的问题是您没有将这些项添加到数组中,而是每次都创建一个新数组并覆盖旧数组。然后,您将一个项目添加到该新阵列并继续。因此,您将有 count - 1 泄漏数组和最终数组,每个数组都有一个项目。
在进入循环之前,请执行以下操作:
[testArray autorelease];
testArray = [[NSMutableArray alloc] initWithCapacity:count];
// start the loop
for( /* ... */ ) {
// stuff
[testArray addObject:tempAnnotation];
// etc...
}
答案 1 :(得分:0)
每次循环时,你都会爆破阵列。这条线杀了你:
testArray = [[NSMutableArray alloc] initWithCapacity:count];
在循环开始前把它放好,你会没事的。
答案 2 :(得分:0)
Sosborn的回答是正确的,你需要做的就是确保你的数组初始化一次,每次迭代都不会覆盖它。
我确实想添加关于数组迭代的一件事,我认为这对你将来有利。考虑一下这样一个事实,即数组具有枚举器,并且使用枚举器技术和传统的语法可以非常简化for循环语法。
我按照我讨论的方式简化了你的代码:
for (NSDictionary *testDict in theResults)
{
//Do what you need to with an instance of a dictionary from the array
}
这使得它变得更容易,因为您不必首先找出数组中的项目数。它自动知道它应该迭代多少。此外,您不负责获取循环的条件语句正确或处理增加int以保持跟踪。如果您认为这有用,请投票。