黑马程序员技术交流社区

标题: 关于OC的深复制和浅复制 [打印本页]

作者: kfz0507    时间: 2017-6-12 22:20
标题: 关于OC的深复制和浅复制
创建一个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;
}
作者: 呉HENG    时间: 2017-6-12 22:48
这个点很重要,赶紧小本本记下来




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2