NSDate 的不同实例指向相同分配的内存?

Different instances of NSDate pointing to the same allocated memory?

我正在创建测试,我必须确保 2 个不同的 NSDate 实例确实是分配内存的两个不同实例。所以我有这个示例代码:

NSDate *date1 = [NSDate date];
NSDate *date2 = [[NSDate alloc] initWithTimeInterval:0 sinceDate:date1];
XCTAssertEqualObjects(date1, date2);
XCTAssertNotEqual(date1, date2);

第一个断言应该使用 "isEqual" 比较对象值,而且效果很好!

第二个断言应该使用“==”比较指针。奇怪的是它有时会随机失败,告诉我两个指针具有相同的值(即,它们指向相同的分配内存)。

因为我分配了两次,它应该是不同的内存区域...那么为什么我的测试有时会随机失败?也许 XCode 正在以某种方式重用内存区域?

您无法可靠地强制创建单独的对象。一些 类 可能使用标记指针。 类 的集合会随着 OS 的发布而改变。标记指针实际上只是将对象的值编码为指针大小的值。它不分配任何内存。根据定义,任何两个表示为标记指针且值相等的对象将具有相等的 "addresses".

此外,init 方法只是一种方法。它可以 return 它想要的任何对象。没有规定它必须 return 接收者。它可以释放发送到 (self) 的 alloced 对象和 return 不同的对象。如果它可以确定现有对象(例如您传递给 -initWithTimeInterval:sinceDate: 的参数)满足其需要,它可能 return 该对象(具有额外的保留)。这种事情在不可变值 类 中很常见,比如 NSDateNSString.

您将不得不重新考虑您的假设需求 "make sure 2 different NSDate instances are really two different instances of allocated memory"。