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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 泥娃娃 中级黑马   /  2016-3-19 14:10  /  620 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  创建一个NSDictionary对象,随便往里面添加内容,然后通过代码产生可变和不可变副本,这些复制是深复制还是浅复制?(Objective-C)

  1. #import <Foundation/Foundation.h>

  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.         //创建多组键值对的字典
  5.         NSDictionary *dict = [NSDictionary dictionaryWithObject:@"张三" forKey:@"zs"];
  6.         //遍历字典
  7.         [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  8.             NSLog(@"dict  %@ = %@",key,obj);
  9.         }];
  10.         NSLog(@"%p",dict);//dict字典地址
  11.         

  12.         
  13.         NSMutableDictionary *dict1 = [dict copy];//产生不可变副本
  14. //          [dict1 setObject:@"李四" forKey:@"zs"];   //无法修改
  15.         // 遍历字典
  16.         [dict1 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  17.             NSLog(@"dict  %@ = %@",key,obj);
  18.         }];
  19.          NSLog(@"%p",dict1);//dict1字典地址 = dict字典地址
  20.         
  21. //dict1字典地址 = dict字典地址,且内容不可变,由以上信息得出结论:没有产生新对象,copy是浅复制。
  22.         
  23.         
  24.         
  25.         
  26.     NSMutableDictionary  *dict2 = [dict mutableCopy];//产生可变副本
  27.         
  28.         [dict2 setObject:@"李四" forKey:@"zs"];//修改Value值
  29.         // 遍历字典
  30.         [dict2 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
  31.             NSLog(@"dict  %@ = %@",key,obj);
  32.         }];
  33.            NSLog(@"%p",dict2);//dict2字典地址!=dict字典地址
  34.         
  35. //dict1字典地址 != dict字典地址,内容可变,由以上信息得出结论:产生了新对象,mutablecopy是深复制。
  36.     }
  37.     return 0;
  38. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马