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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 木子小静 中级黑马   /  2014-12-25 21:11  /  907 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

创建一个NSDictionary对象,随便往里面添加内容,然后通过代码产

生可变和不可变副本,这些复制是深复制还是浅复制?这个怎么写啊?

1 个回复

倒序浏览
深复制产生新对象,浅复制不产生。
只有不可变对象copy时才是浅复制,其他三种都是深复制。
这里深浅复制针对字典本身,里面的对象其实还是浅复制。
  1. // 不可变字典
  2.     NSDictionary *dict = @{@"a" : @1, @"b" : @2, @"c" : @3};
  3.    
  4.     // 不可变的copy 浅复制 不产生新对象 指向同一对象 原对象引用计数器+1
  5.     NSDictionary *copy = [dict copy];
  6.     NSLog(@"dict引用计数:%lu, dict地址:%p", [dict retainCount], dict);
  7.     NSLog(@"copy引用计数:%lu, dict地址:%p", [copy retainCount], copy);
  8.    
  9.     // 不可变的mutableCopy 深复制 产生新对象 原对象引用计数器不变 新的为1
  10.     NSMutableDictionary *mutable = [dict mutableCopy];
  11.     NSLog(@"dict   引用计数:%lu, dict   地址:%p", [dict retainCount], dict);
  12.     NSLog(@"mutable引用计数:%lu, mutable地址:%p", [mutable retainCount], mutable);
  13.    
  14.     // 可变的copy  同上
  15.     NSDictionary *copy2 = [mutable copy];
  16.     NSLog(@"mutable引用计数:%lu, mutable地址:%p", [mutable retainCount], mutable);
  17.     NSLog(@"copy2  引用计数:%lu, copy2  地址:%p", [copy2 retainCount], copy2);
  18.    
  19.     // 可变的mutableCopy 同上
  20.     NSMutableDictionary *mutable2 = [mutable mutableCopy];
  21.     NSLog(@"mutable 引用计数:%lu, mutable 地址:%p", [mutable retainCount], mutable);
  22.     NSLog(@"mutable2引用计数:%lu, mutable2地址:%p", [mutable2 retainCount], mutable2);
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马