#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. Потрясающе. Спасибо!