A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kfz0507 中级黑马   /  2017-6-12 22:20  /  1552 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

创建一个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;
}

1 个回复

倒序浏览
这个点很重要,赶紧小本本记下来
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马