深拷贝和浅拷贝

     /**

         *  不可变赋值可变 --指针不兼容报警告.

         */

//        NSArray *array = [NSArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];

        //  NSMutableArray *mutableArray = array; --指针不兼容报警告.

        

        //1.解决办法

        //NSMutableArray *mutableArray = [array copy]; //不创建新对象.浅拷贝(单纯的指针赋值)-说明虽然可以解决不报警告的问题.但是mutableArray的本质还是不可变的所以不能调用[mutableArray removeObject:@"liuyang"];可以正常打印

   

        

        /**

         打印结果

         mutableArray==0x1002049e0 mutableArray=(

         liuyang,

         xiaoqian

         )--array==0x1002049e0  array==(

         liuyang,

         xiaoqian

         )

         */

        

//        //2.解决方法二

//        NSMutableArray *mutableArray = [array mutableCopy]; //创新新的mutableArray对象并且是可变的对象.深拷贝-可以调用[mutableArray removeObject:@"liuyang"];方法 mutableArray的内容改变不会影响array的内容

//        [mutableArray removeObject:@"liuyang"];

//        NSLog(@"mutableArray==%p mutableArray=%@--array==%p  array==%@",mutableArray,mutableArray,array,array);

        

        /**

         打印结果

         mutableArray==0x100210c00 mutableArray=(

         xiaoqian

         )--array==0x100210ba0  array==(

         liuyang,

         xiaoqian

         )

         */

        

#pragma mark - situation two : NSArray = NSArray

        

        /**

         *  不可变赋值不可变

         */

        //situation one : 指针 内存区域(对象) 深入理解

        //NSArray *array = [NSArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];//现在array指针指向的的对象是0x10020c890内存区域.所以array是可以存储任何内存地址.也就是谁赋值给它.它就指向谁,对谁进行操作.注意赋值之前和之后的指针指向的对象是不同的.

        //NSLog(@"%p- %@",array,array);

        //NSArray *mutableArray = array;

        //array = [mutableArray arrayByAddingObject:@"lyx"]; //数组追加对象返回一个新的数组对象赋值给array指针.这个时候array指针指向的是新数组对象也就是另一个内存区域0x100400080

        


        //situation two :

        //NSArray *mutableArray = [array copy]; //单纯的指针赋值 array对象增加了一个指针指向

        //NSArray *mutableArray = [array mutableCopy]; //创建新的对象本质是mutableArray__NSArrayM类型

        //NSLog(@"%@",[mutableArray className]);

        

        

#pragma mark - situation three : NSArray =  NSMutableArray

        

        

        /**

         *  可变赋值不可变 --指针兼容

         */

        //NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];

//        NSArray *array = mutableArray; //指针兼容单纯指针赋值(指向同一个对象) mutableArray内容改变 array内容也改变

//        [mutableArray removeObject:@"liuyang"];

//        NSLog(@"%@",[mutableArray className]);

//

//        NSArray *array = [mutableArray copy]; //创建新对象__NSArrayI类型 mutableArray内容改变不影响array的内容

//        [mutableArray removeObject:@"liuyang"];

//        NSLog(@"%@",[array className]);

        

//        NSArray *array = [mutableArray mutableCopy];  //创建新对象__NSArrayM类型 mutableArray内容改变不影响array的内容

//        NSLog(@"%@",[array className]);

//        [mutableArray removeObject:@"liuyang"];

        

        

        

#pragma mark - situation four : NSMutableArray = NSMutableArray

        

        

//        NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"liuyang",@"xiaoqian", nil];

        //NSMutableArray *array = mutableArray;   //浅拷贝单纯的赋值.指向同一个对象两个指针都可以对对象进行操作.内容都随之改变

        //[array removeObject:@"liuyang"];

//        //NSLog(@"%@",[array className]);  //__NSArrayM

//        

//        NSMutableArray *array = [mutableArray copy]; //创建新的对象.对象是__NSArrayI类型.内部还是不能调用[mutableArray removeObject:@"liuyang"];会报错   __NSArrayM内部能调用改变数组的方法 内部不随之改变

//        NSLog(@"%@",[array className]);  //__NSArrayINSArray内部类型.

        //[array removeObject:@"11"]; //报错__NSArrayI不能调用removeObject方法

        

        

//        

//        NSMutableArray *array = [mutableArray mutableCopy]; //创建新对象对象是__NSArrayM类型内部可以调用改变数组的方法

//        NSLog(@"%@",[array className]);  //__NSArrayM

//        [array removeObject:@"liuyang"]; //内容不随之改变

//        NSLog(@"mutableArray==%p mutableArray=%@--array==%p  array==%@",mutableArray,mutableArray,array,array);

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值