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

2018-03-02  本文已影响27人  struggle3g

引言

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

不可变类型变量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是可变的。

结论

上一篇 下一篇

猜你喜欢

热点阅读