Какао: Ошибка при добавлении объектов из цикла в изменяемый массив - PullRequest
0 голосов
/ 19 августа 2011

Кажется, у меня странная проблема при попытке добавить объекты в изменяемый массив.Дело в том, что у меня есть массив словарей с координатами, которые я получаю из внешней базы данных, и я пытаюсь сделать цикл через них, извлечь координаты, создать пользовательский объект аннотации и затем добавить его в изменяемый массив.

Проблема в том, что массив, в котором я их получаю, показывает, что в нем всего 1 объект, а в первом - 5.

Пожалуйста, помогите!

Вот код (примечание: testArray - это свойство в моем классе, я не создаю его ниже, я просто пытаюсь использовать его для хранения объектов)

Спасибо!

int раз;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 ]

1 голос
/ 19 августа 2011

Ваша проблема в том, что вы не добавляете эти элементы в свой массив, вместо этого вы каждый раз создаете новый массив и перезаписываете старый. Затем вы добавляете элемент в этот новый массив и продолжаете. Следовательно, у вас будет count - 1 просочившихся массивов и окончательный массив, каждый с одним элементом.

Прежде чем идти в свой цикл, сделайте что-то вроде:

[testArray autorelease];
testArray = [[NSMutableArray alloc] initWithCapacity:count];
// start the loop
for( /* ... */ ) {
  // stuff
  [testArray addObject:tempAnnotation];
  // etc...
}
0 голосов
/ 19 августа 2011

Ответ Сосборна правильный, и все, что вам нужно сделать, это убедиться, что ваш массив инициализируется один раз, и каждая итерация не перезаписывает его.будет выгодно для вас в будущем.Примите во внимание тот факт, что массивы имеют перечислители и что синтаксис цикла for может быть значительно упрощен с использованием метода перечислителя по сравнению с традиционным синтаксисом.

Я упростил ваш код в обсуждаемом порядке:*

 for (NSDictionary *testDict in theResults)
 {
   //Do what you need to with an instance of a dictionary from the array
 }

Это просто облегчает задачу, поскольку вам не нужно сначала узнавать количество элементов в массиве.Он автоматически знает, через сколько он должен пройти.Кроме того, вы не несете ответственности за правильность условного оператора цикла или за увеличение значения int для отслеживания.Если вы считаете, что это было полезно, пожалуйста, проголосуйте.

0 голосов
/ 19 августа 2011

Вы уничтожаете свой массив каждый раз, когда проходите цикл.Эта строка убивает вас:

testArray = [[NSMutableArray alloc] initWithCapacity:count];

Поставьте это перед началом цикла, и у вас все будет хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...