Cocoa:将循环中的对象添加到可变数组时出错

时间:2011-08-19 09:03:17

标签: iphone loops

在尝试将对象添加到可变数组时,我似乎遇到了一个奇怪的问题。问题是我有一个带有坐标的字典数组,我从外部数据库获取并尝试循环遍历它们,提取坐标,创建自定义注释对象,然后将其添加到可变数组中。

问题是我得到的数组显示它只有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];
}

3 个答案:

答案 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以保持跟踪。如果您认为这有用,请投票。