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

时间:2016-03-14 20:44:54

标签: objective-c memory-management nsdate

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

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

第一个断言应该使用“isEqual”比较对象值,并且它工作得很好!

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

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

1 个答案:

答案 0 :(得分:3)

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

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

您将不得不重新考虑您的假设需求"确保2个不同的NSDate实例实际上是分配内存的两个不同实例"。