zoukankan      html  css  js  c++  java
  • oc80--copy

    //
    //  main.m
    //  Copy基本使用,拷贝的本质:修改其中一个不能影响另外一个。
    
    //  每个oc对象都有copy和mutableCopy方法,前提是必须遵守NSCopying协议实现copyWithZone方法和NSMutableCopying协议实现mutableCopyWithZone方法。
    
    //  copy出来的对象是不可变的(NSString,NSArray,NSDictionary),NSMutableString调用copy方法出来的是NSString,mutableCopy出来的对象是可变的(NSMutableString,NSMutableArray,NSMutableDictionary).NSString调用mutableCopy方法出来的是NSMutableString。
    
    //  oc大部分对象都遵循了NSCopying和NSMutableCopying协议,自定义对象是没有copy和mutableCopy方法的。
    //
    
    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
    
         // 会生成一个新的对象
        NSString *srcStr1 = @"lnj";
        // 只要是拷贝出来的对象, 拷贝出来的对象中的内容和以前对象中的内容一致
        // "一般"情况下拷贝会生成一个新的对象
        // 为什么会产生一个新的对象 1.因为拷贝要求修改原来的对象不能影响到拷贝出来得对象 
                                  修改拷贝出来的对象也不能影响到原来的对象, 所以需要生成一个新的对象 
                                2.由于以前的对象是一个不可变的对象, 而通过mutableCopy拷贝出来的对象必须是一个可变的对象, 所以必须生成一个新的对象
        
        NSMutableString *copyStr1 = [srcStr1 mutableCopy];
        NSLog(@"srcStr = %@, copyStr = %@", srcStr1, copyStr1);
        NSLog(@"srcStr = %p, copyStr = %p", srcStr1, copyStr1);//srcStr = 0x100004238, copyStr = 0x100700090
        
        
        
        //  会生成一个新的对象
        NSMutableString *srcStr2 = [NSMutableString stringWithFormat:@"lnj"];
        NSMutableString *copyStr2 = [srcStr2 mutableCopy];
        
        [srcStr2 appendString:@" cool"];
        NSLog(@"srcStr = %@, copyStr = %@", srcStr2, copyStr2);
        NSLog(@"srcStr = %p, copyStr = %p", srcStr2, copyStr2);//srcStr = 0x100300560, copyStr = 0x100202780
        
        
    
         //  会生成一个新的对象
        NSMutableString *srcStr3 = [NSMutableString stringWithFormat:@"lnj"];
        NSString *copyStr3 = [srcStr3 copy];
        [srcStr3 appendString:@" cool"];
        NSLog(@"srcStr = %@, copyStr = %@", srcStr3, copyStr3);
        NSLog(@"srcStr = %p, copyStr = %p", srcStr3, copyStr3);//srcStr = 0x100204aa0, copyStr = 0x6a6e6c35
        
        
        //不生成新的对象
        // 如果是通过不可变对象调用了copy方法, 那么不会生成一个新的对象(2个都是不可变的,那么可以公用一个算了,只要有一个是可变的,那么修改一个就会影响另外一个,所以不能指向同一个内存空间)。
        // 原因: 因为原来的对象是不能修改的, 拷贝出来的对象也是不能修改的,既然两个都不能修改, 所以永远不能影响到另外一个对象, 那么已经符合需求,所以: OC为了对内存进行优化, 就不会生成一个新的对象
        NSString *srcStr = @"lnj";
        NSString *copyStr = [srcStr copy];
        NSLog(@"srcStr = %p, copyStr = %p", srcStr, copyStr);//srcStr = 0x100004238, copyStr = 0x100004238
        
        /*
         正是因为调用copy方法有时候会生成一个新的对象, 有时候不会生成一个新的对象
         所以: 如果没有生成新的对象, 我们称之为浅拷贝, 本质就是指针拷贝
              如果生成了新的对象, 我们称之为深拷贝, 本质就是会创建一个新的对象
         */
        return 0;
    }
  • 相关阅读:
    【数论】线性模方程
    【数论】拓展欧几里得
    BZOJ1433: [ZJOI2009]假期的宿舍
    BZOJ2823: [AHOI2012]信号塔
    BZOJ1088: [SCOI2005]扫雷Mine
    BZOJ1257: [CQOI2007]余数之和sum
    BZOJ1227: [SDOI2009]虔诚的墓主人
    BZOJ1856: [Scoi2010]字符串
    BZOJ1084: [SCOI2005]最大子矩阵
    BZOJ2007: [Noi2010]海拔
  • 原文地址:https://www.cnblogs.com/yaowen/p/7441894.html
Copyright © 2011-2022 走看看