复制NSDate(想要独立的对象)

时间:2011-10-25 06:56:05

标签: objective-c nsdate

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"

两个对象相同(对象ID相同)。我错过了什么?如何将独立对象作为副本?

2 个答案:

答案 0 :(得分:27)

copy不保证不同的对象指针。 “功能独立”意味着对原始对象的更改不会反映在副本中,因此对于不可变对象copy可能会起retain的作用(我不知道这是否有保证,可能不是)。

尝试date2 = [[NSDate alloc] initWithTimeInterval:0 sinceDate:date1]

答案 1 :(得分:2)

<强>小心!

我最近发现,在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