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相同)。我错过了什么?如何将独立对象作为副本?
答案 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