К сказанному предыдущим оратором поясню, почему вам надо сделать то, что он посоветовал.
Вот ваш код:
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 (указатель - тот же, а объект, на который он указывает - другой), и проделаете с ним то же самое.
Вам надо курить указатели и работу с ними, из вашего вопроса ясно, что вы их не понимаете.