美文网首页
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