Копирование NSDate (для получения независимых объектов) - PullRequest
9 голосов
/ 25 октября 2011

NSDate соответствует протоколу NSCopying. Согласно документации для протокола NSCopying:

a copy must be a functionally independent object with values identical
to the original at the time the copy was made.

Но когда я это сделаю:

NSDate *date1 = [NSDate date];
NSDate *date2 = [date1 copy];
NSLog(@"result: date1 0x%x  date2 0x%x", (int)date1, (int)date2);
// "result: date1 0x2facb0  date2 0x2facb0"

Два объекта идентичны (один и тот же идентификатор объекта). Что мне не хватает? Как получить независимый объект в качестве копии?

Ответы [ 2 ]

27 голосов
/ 25 октября 2011

copy не гарантирует другой указатель объекта. «Функционально независимый» означает, что изменения в исходном объекте не будут отражены в копии, и поэтому для неизменяемых объектов copy может работать как retain (хотя я не знаю, гарантировано ли это, вероятно, нет).

Попробуйте date2 = [[NSDate alloc] initWithTimeInterval:0 sinceDate:date1].

2 голосов
/ 04 декабря 2014

Осторожно!

Я недавно узнал, что на iOS 8.1 (.0) [NSDate dateWithTimeInterval:0 sinceDate:date1] возвращает date1!Даже alloc / init возвращает один и тот же объект.

Глубокая копия была для меня важна, так как я создаю копии объектов.Позже я сравниваю метки времени с [date1 laterDate:date2] == date2, который всегда будет истинным, если не работает глубокая копия.

То же самое для [date1 dateByAddingTimeInterval:0]

У меня нет хорошего решения для iOS 8.1пока что, но продолжайте поиск и обновлю здесь.Экстренным обходным решением может быть создание строки даты с использованием средства форматирования, а затем создание даты из строки с тем же средством форматирования.

Редактировать: Это становится еще хуже:

NSString *date1String = [iso8601DateFormatter stringFromDate:date1];
date2 = [iso8601DateFormatter dateFromString:date1String];

(lldb) p date1
(NSDate *) $0 = 0xe41ba06fd0000000 2014-11-03 01:00:00 CET
(lldb) p date2
(NSDate *) $1 = 0xe41ba06fd0000000 2014-11-03 01:00:00 CET
...