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
) 的 alloc
ed 对象和 return 不同的对象。如果它可以确定现有对象(例如您传递给 -initWithTimeInterval:sinceDate:
的参数)满足其需要,它可能 return 该对象(具有额外的保留)。这种事情在不可变值 类 中很常见,比如 NSDate
或 NSString
.
您将不得不重新考虑您的假设需求 "make sure 2 different NSDate instances are really two different instances of 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
) 的 alloc
ed 对象和 return 不同的对象。如果它可以确定现有对象(例如您传递给 -initWithTimeInterval:sinceDate:
的参数)满足其需要,它可能 return 该对象(具有额外的保留)。这种事情在不可变值 类 中很常见,比如 NSDate
或 NSString
.
您将不得不重新考虑您的假设需求 "make sure 2 different NSDate instances are really two different instances of allocated memory"。