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:
,您可能会得到相同的字典。
这是代码。
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:
,您可能会得到相同的字典。