Массив словарей, пустой словарь, сохранение данных массива

#iphone #objective-c #arrays

#iPhone #objective-c #массивы

Вопрос:

У меня есть NSMutableArray (tripHistory), NSMutableDictionary в который каждую секунду добавляется (currentUpdate) с новыми данными.

 [currentUpdate setObject:testVariable forKey:@"Test"];
[tripHistory addObject:currentUpdate];
[currentUpdate removeAllObjects];
 

Тем не менее, когда я перебираю tripHistory вызов [[tripHistory objectAtIndex:i] description] , все равно null.

Мой цикл выглядит следующим образом:

 for (int i=0; i<[tripHistory count]; i  )
{
    NSLog(@"%@", [[tripHistory objectAtIndex:i] description]);
}
 

Чтобы инициализировать мои переменные, следующий код вызывается только для первого обновления.

 tripHistory = [[NSMutableArray alloc] init];
currentUpdate = [[NSMutableDictionary alloc] init];
 

Есть идеи?

Ответ №1:

Добавление объекта в NSArray не создает его копию. Все, что происходит, это увеличение количества ссылок. Поэтому currentUpdate и добавленный в tripHistory NSDictionary являются одним и тем же. Если вы удаляете объекты из currentUpdate , вы также удаляете объекты из NSDictionary tripHistory .

После добавления currentUpdate в tripHistory все, что вам нужно сделать, это выпустить currentUpdate и начать заново с новым пустым NSDictionary для следующего обновления.

Комментарии:

1. Как я могу принудительно освободить его при включенной ARC?

2. Понял! Я просто currentUpdate = [[NSMutableDictionary alloc]init]; каждый раз, когда он обновляется.

3. Вы этого не делаете. Просто повторно назначьте ему новый словарь при запуске следующего обновления: currentUpdate = [NSMutableDictionary alloc] init];

4. Да, именно так! Ты меня опередил.

Ответ №2:

Не удаляйте объекты. Словарь и массив хранят ссылки на одни и те же объекты. Если вы хотите добавить еще один dict в массив, затем отпустите первый dict и создайте новый

Ответ №3:

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

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

Комментарии:

1. Это сработало, и вы также обратились к моей проблеме ARC. Потрясающе. Спасибо!