创建一个NSDictionary,并创建可变副本和不可变副本,说下是深复制还是浅复制。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//**************************第一步:创建NSDictionary字典**************************
// 第一种方式: 创建一个NSDictionary
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"value1" forKey:@"key1"];
// 第二种方式: 创建一个NSDictionary
NSDictionary *dict2 = @{@"key2":@"value2",@"key3":@"value3"};
// 第三种方式:创建一个NSDictionary
NSArray *keyArray = @[@"key4",@"key5"];
NSArray *valueArray = @[@"value4",@"value5"];
NSDictionary *dict3 = [NSDictionary dictionaryWithObjects:valueArray forKeys:keyArray];
//**************************第二步:创建可变副本和不可变副本**************************
NSDictionary *ncDict1 = [dict1 copy]; //不可变副本
NSDictionary *ncDict2 = [dict2 copy]; //不可变副本
NSDictionary *ncDict3 = [dict3 copy]; //不可变副本
NSMutableDictionary *mDict1 = [dict1 mutableCopy]; //可变副本
NSMutableDictionary *mDict2 = [dict2 mutableCopy]; //可变副本
NSMutableDictionary *mDict3 = [dict3 mutableCopy]; //可变副本
//**************************第三步:测试可变副本能否增加键值对**************************
NSLog(@"旧的 mDict1 = %@",mDict1);
NSLog(@"旧的 mDict2 = %@",mDict2);
NSLog(@"旧的 mDict3 = %@",mDict3);
[mDict1 setObject:@"value6" forKey:@"key6"]; //深复制产生的可变副本可以增加键值对
[mDict2 setObject:@"value6" forKey:@"key6"]; //深复制产生的可变副本可以增加键值对
[mDict3 setObject:@"value6" forKey:@"key6"]; //深复制产生的可变副本可以增加键值对
NSLog(@"新的 mDict1 = %@",mDict1);
NSLog(@"新的 mDict2 = %@",mDict2);
NSLog(@"新的 mDict3 = %@",mDict3);
//**************************第四步:测试不可变副本能否增加键值对**************************
NSLog(@"旧的 ncDict1 = %@",ncDict1);
NSLog(@"旧的 ncDict2 = %@",ncDict2);
NSLog(@"旧的 ncDict3 = %@",ncDict3);
// [ncDict1 setValue:@"value6" forKey:@"key6"]; //浅复制产生的不可变副本不可增加键值对,运行时会报错
// [ncDict1 setValue:@"value6" forKey:@"key6"]; //浅复制产生的不可变副本不可增加键值对,运行时会报错
// [ncDict1 setValue:@"value6" forKey:@"key6"]; //浅复制产生的不可变副本不可增加键值对,运行时会报错
}
return 0;
} |
|