Waka_Waka
@Waka_Waka
IOS Developer

Почему происходит сброс данных в массиве?

Всем привет))

У меня написан метод:
-(NSArray*)creatingMultipleCards:(NSArray*)array{
    NSMutableArray *tmpCards = [NSMutableArray new];
    
    //Будем проверять каждую карточку на содержание нескольких дат. В случае если дат больше одной, то формируем несколько карточек.
    for(Card *obj in array){
        
        if ([obj.urgencyTimes count] > 1) {
            //Если у карточки больше одной даты, то формируем для каждой даты отдельную карточку.
            for (UrgencyTime *cardTime in obj.urgencyTimes) {
                    Card *tmp = obj;
                    tmp.beginDate = cardTime.start;
                    tmp.endDate = cardTime.end;
                    
                    [tmpCards addObject:tmp];
                }
            }
        else
            {
                [tmpCards addObject:obj];
            }
        }
    
    return tmpCards;
}


Есть объект карточки, который содержит 5 свойств:
  • Имя события
  • Описание события
  • Начало события
  • Конец события
  • Массив из дат проведения какого-либо события


Метод получает массив из карточек.

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

Так вот, после того, как завершится цикл, который создает эти дополнительные карточки, во всех карточках становится одна дата начала и конца события.

И даты становятся во всех карточках одинаковыми, только после выхода из цикла.
В чем может быть проблема?

P.S. Исправил опечатку в коде.
  • Вопрос задан
  • 2354 просмотра
Пригласить эксперта
Ответы на вопрос 2
Flanker_4
@Flanker_4
Вам нужно заменить
Card *tmp = obj;
На
Card *tmp = [obj copy]
или
Card *tmp = [Card new];

В зависимости от специфики того, что вы делаете
Мне не видно всех свойств Card
Ответ написан
Комментировать
К сказанному предыдущим оратором поясню, почему вам надо сделать то, что он посоветовал.

Вот ваш код:

for (UrgencyTime *cardTime in obj.urgencyTimes) {
                    Card *tmp = obj;
                    tmp.beginDate = cardTime.start;
                    tmp.endDate = cardTime.end;
}


Что он делает? Построчно:
0. Ну, цикл
1. Вы объявляете указатель tmp на объект типа Card и присваиваете этому указателю ссылку на объект obj, поэтому у вас теперь tmp == obj и, работая с tmp, вы работаете фактически с obj
2 и 3. Присваиваете свойствам объекта obj некоторые значения

На следующей итерации вы повторяете то же самое, только присваеваемые значения берутся из другого объекта cardTime - но присваиваются они тому же самому объекту obj, что и на первой итерации.

Потом на более высоком уровне цикла вы выберете другой объект, на который сошлется указатель obj (указатель - тот же, а объект, на который он указывает - другой), и проделаете с ним то же самое.

Вам надо курить указатели и работу с ними, из вашего вопроса ясно, что вы их не понимаете.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы