美文网首页
iOS 深、浅拷贝的那些奇葩的事(四)

iOS 深、浅拷贝的那些奇葩的事(四)

作者: struggle3g | 来源:发表于2018-03-02 18:14 被阅读27次

引言

 在前面两篇,讲到了深(单层深拷贝、完整深拷贝)、浅拷贝的概念、应用、验证,来认识深拷贝、浅拷贝,这篇就具体说一下在开发过程中遇到的一些深、浅拷贝那些奇葩的事情。

不可变类型变量Copy赋值给可变类型变量,调用可变类型变量的方法崩溃

 步骤:

  1. 创建一个不可变类型(NSDictionary)变量Dict1并初始化.
  2. 将Dict1变量赋值给(NSMutableDictionary)变量的MutableDict1.
  3. 调用Dict2的NSMutableDictionary的方法运行。
    NSString *Str1 = @"test1";
    NSString *Str2 = @"test2";
    NSString *Str3 = @"test3";
    NSDictionary *Dict1 = @{@"key1":Str1,@"key2":Str2,@"key3":Str3};
    NSMutableDictionary *MutableDict1 = [Dict1 copy];
    [MutableDict1 setObject:@"111" forKey:@"key3"];

验证崩溃:


image.png
-[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x6000004685c0

结果表明
 崩溃的点在于像__NSDictionaryI这个对象实例发送setObject:forKey:没有找到这个方法,崩溃,具体的时间我在以前的文章中介绍过->向nil、实例对象发送消息

不可变类型变量MutableCopy赋值给可变类型变量,调用可变类型变量的方法,正常执行

 __NSDictionaryI、__NSDictionaryM是什么意思?创建NSDictionary、NSMutableDictionary两个实例,分别打印他们的Class.

2018-03-02 18:23:59.274385+0800 PropertyTest[4298:1121321] __NSDictionaryM
2018-03-02 18:23:59.274806+0800 PropertyTest[4298:1121321] __NSDictionaryI

 上述NSDictionary、NSMutableDictionary分别打印的结果是:__NSDictionaryI、__NSDictionaryM。
__NSDictionaryI 是不可变的、__NSDictionaryM是可变的。

结论

  • NSDictionary、NSMutableDictionary在执行的时候是__NSDictionaryI、__NSDictionaryM;

  • 分别代表了不可变、可变类型的字典;

  • 当用Copy复制NSDictionary的时候复制出来的对象类型是__NSDictionaryI;

  • 但是用MutableCopy复制NSDictionary的时候复制出来的对象类型是__NSDictionaryM。

  • 不可变类型的变量Copy出来的是不可变的(因为浅拷贝只拷贝指针,原有变量就是不可变的),MutableCopy出来的对象是可变的。

  • 可变类型的变量Copy出来的是可变的(因为浅拷贝只拷贝指针,原有变量就是可变的),MutableCopy出来的对象是可变的。

相关文章

网友评论

      本文标题:iOS 深、浅拷贝的那些奇葩的事(四)

      本文链接:https://www.haomeiwen.com/subject/anmaxftx.html