美文网首页
copy、mutableCopy

copy、mutableCopy

作者: 桃花流水鳜鱼肥 | 来源:发表于2016-03-01 13:27 被阅读112次

    ▍copy和mutableCopy


    首要先说明,很多人把copy叫浅拷贝,mutableCopy叫深拷贝,这是不对的。copy、mutableCopy和深拷贝、浅拷贝是两个概念,用法也是不一样的。

    copy和mutableCopy分别遵守NSCopying和NSMutableCopying协议,对应实现copyWithZone和mutableCopyWithZone方法。也就是说,只要遵守了NSCopying和NSMutableCopying协议的类,都能实现copy和mutableCopy。比如NSString、NSNumber类(只能实现copy)。

    • copy
        NSString *string = @"清分";
        NSString *copyString = [string copy];
        NSLog(@"string:%p",string);
        NSLog(@"copyString:%p",copyString);
    
    输出两个地址相同:
    string:0x1000a10b0
    copyString:0x1000a10b0
    
    
        NSMutableString *mutableString = [NSMutableString stringWithString:@"明月"];
        NSString *copyString2 = [mutableString copy];
        NSLog(@"mutableString:%p",mutableString);
        NSLog(@"copyString2:%p",copyString2);
    
    输出两个地址不同:
    mutableString:0x125f0f290
    copyString2:0x125d25600
    

    copy使用原则:
    1.obj2 = [obj1 copy]返回的一定是一个不可变对象,无论obj1是否可变。
    2.如果obj1是一个不可变对象,那么obj2指向同一个对象(返回自己);如果obj1是一个可变对象,那么obj2指向不同的对象(生成新对象)。

    • mutableCopy
        NSString *string = @"清分";
        NSMutableString *mutableCopyString = [string mutableCopy];
        NSLog(@"string:%p",string);
        NSLog(@"mutableCopyString:%p",mutableCopyString);
        
    输出两个地址不同:
    string:0x1000c50b0
    mutableCopyString:0x15fd701f0
    
        NSMutableString *mutableString = [NSMutableString stringWithString:@"明月"];
        NSMutableString *mutableCopyString2 = [mutableString mutableCopy];
        NSLog(@"mutableString:%p",mutableString);
        NSLog(@"mutableCopyString2:%p",mutableCopyString2);
    
    输出两个地址不同:
    mutableString:0x15ff3f420
    mutableCopyString2:0x15fe29c10
    

    mutableCopy使用原则:
    1.obj2 = [obj1 mutableCopy]返回的一定是一个可变对象,无论obj1是否可变。
    2.不论obj1是否可变,mutableCopy后的对象都指向不同的地址,也就是都生成了新的对象。

    口诀:
    不可变copy是引用,可变copy是初始化。
    不可变,可变mutableCopy都是初始化。
    copy返回不可变对象,mutableCopy返回可变对象。

    相关文章

      网友评论

          本文标题:copy、mutableCopy

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