美文网首页
Copy 和 MutableCopy

Copy 和 MutableCopy

作者: Roger_max | 来源:发表于2018-10-17 15:26 被阅读4次
    @interface ViewController ()
    
    // Strong
    @property (nonatomic, strong) NSString *sString;
    @property (nonatomic, strong) NSArray *sArray;
    // Copy
    @property (nonatomic, copy) NSString *cString;
    @property (nonatomic, copy) NSArray *cArray;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 使用strong时,如果这个属性指向一个可变对象,修改可变对象时,这个属性值也会被修改
        NSMutableString *mString = [NSMutableString stringWithString:@"strong"];
        self.sString = mString;
        self.cString = mString;
        [mString appendString:@"_change"];
        NSLog(@"\n sString = %@ \n cString = %@", self.sString, self.cString);
        
        // NString,NSArray,NSDictionary都有自己对应的子类:NSMutableString,NSMutableArray,NSMutableDictionary,而父类指针可以指向子类对象,使用copy可以让本对象不受外界(子对象)影响,无论给我传入的是一个可变对象还是一个不可变对象,都能保证自身持有的是一个不可变副本
        NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@1, @2, @3,  nil];
        self.sArray = mArray;
        self.cArray = mArray;
        [mArray addObject:@4];
        NSLog(@"\n sArray = %@ \n cArray = %@", self.sArray, self.cArray);
    }
    
    
    @end
    

    日志输出

      使用copy能保证属性不被子类对象修改时同时被修改。
      sString = strong_change 
      cString = strong
      sArray = (
        1,
        2,
        3,
        4
      ) 
      cArray = (
        1,
        2,
        3
      )
    

    Copy 和 MutableCopy

    // 浅拷贝:地址的拷贝
        // 深拷贝:内容的拷贝
        
        // 非集合对象的copy
        NSString *string = @"string";
        NSString *stringCopy = [string copy];
        NSString *stringMCopy = [string mutableCopy];
        NSLog(@"\nstring: \n%p \nstringCopy: \n%p \nstringMCopy: \n%p", string, stringCopy, stringMCopy);
    
    string: 
    0x100270088 
    stringCopy: 
    0x100270088 
    stringMCopy: 
    0x1c425a490
        
        // 非集合对象的mutableCopy
        NSMutableString *mString = [NSMutableString stringWithString:@"mString"];
        NSString *mStringCopy = [mString copy];
        NSString *mStringMCopy = [mString mutableCopy];
        NSLog(@"\nmString: \n%p \nmStringCopy: \n%p \nmStringMCopy: \n%p", mString, mStringCopy, mStringMCopy);
    
    mString: 
    0x1c425a2e0 
    mStringCopy: 
    0xa676e697274536d7 
    mStringMCopy: 
    0x1c425a070
        
        // 集合对象的copy NSArray,NSDictionary,NSSet
        NSArray *array = @[@1, @2, @3];
        NSArray *arrayCopy = [array copy];
        NSMutableArray *arrayMCopy = [array mutableCopy];
        NSLog(@"\narray: \n%p \narrayCopy: \n%p \narrayMCopy: \n%p", array, arrayCopy, arrayMCopy);
    
    array: 
    0x1c425a580 
    arrayCopy: 
    0x1c425a580 
    arrayMCopy: 
    0x1c425a0a0
        
        // 集合对象的mutableCopy
        NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@1, @2, @3, nil];
        NSArray *mArrayCopy = [mArray copy];
        NSMutableArray *mArrayMCopy = [mArray mutableCopy];
        NSLog(@"\nmArray: \n%p \nmArrayCopy: \n%p \nmArrayMCopy: \n%p", mArray, mArrayCopy, mArrayMCopy);
    
    mArray: 
    0x1c425a640 
    mArrayCopy: 
    0x1c425a1f0 
    mArrayMCopy: 
    0x1c425a3d0
    
    [immutableObject copy]是浅拷贝
    [immutableObject mutableCopy]是深拷贝
    [mutableObject copy]是深拷贝
    [mutableObject mutableCopy]是深拷贝
    
    集合对象的深拷贝只是对象本身,而集合对象的元素还是地址的拷贝,即单层深拷贝(浅拷贝)
    

    block为什么要使用copy

    block使用copy是在MRC中延续下来的,在MRC下,方法内部的block是存放在栈区,使用copy会将block拷贝到堆区。
    在ARC下编译器会自动对block进行copy,因此我们使用copy或者strong的效果是一样的。但是我们在ARC下继续使用copy可以提醒我们编译器会自动帮我们实现copy的操作。

    参考文章

    相关文章

      网友评论

          本文标题:Copy 和 MutableCopy

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