iOS 集合副本在 NSArray 和 NSDictionary 中打印不同的地址

iOS Collection copy print different address in NSArray and NSDictionary

这是代码。

NSArray *someArray = @[@"2222"];
NSArray *shallowCopyArray = [someArray copyWithZone:nil];

NSLog(@"someArray address: %p", someArray);
NSLog(@"shallowCopyArray address: %p", shallowCopyArray);

NSDictionary *someDictionary = @{@"11": @"22"};
NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];

NSLog(@"someDictionary address: %p", someDictionary);
NSLog(@"shallowCopyDict address: %p", shallowCopyDict);

我得到了指纹:

someArray address: 0x618000000910
shallowCopyArray address: 0x618000000910
someDictionary address: 0x6180000227c0
shallowCopyDict address: 0x6180000228a0

都是浅拷贝,为什么NSArray打印相同的地址而NSDictionary打印不同的地址?

您正在使用两种完全不同的方法来制作副本。对于数组,您在数组上使用 copyWithZone:。由于它是一个不可变数组,它只是 returns self.

对于词典,您正在使用 alloc/init。这将创建一个新实例,但内容相同。

如果您在数组上使用 alloc/init,您可能还会得到一个新数组。如果您在字典上使用 copyWithZone:,您可能会得到相同的字典。