美文网首页ios 底层
iOS 中 Copy 与 MutableCopy 简单理解

iOS 中 Copy 与 MutableCopy 简单理解

作者: iOS_肖晨 | 来源:发表于2018-02-28 14:28 被阅读532次

    关于iOS常见类型(NSString、NSArray以及NSDictionary)的copy方法理解

    概念简介

    • 浅复制:只拷贝内存地址的指针,不开辟新的内存。
    • 深复制:开辟新的内存,创建指向新的内存地址的指针。
    • false深复制:对可变对象进行copy的时候生成的不可变对象,开辟了新的内存,但是对象本身性质发生了改变。

    简单记忆

    • 不可变对象 + copy = 浅复制
    • 不可变对象 + mutableCopy = 深复制
    • 可变对象 + copy = false深复制
    • 可变对象 + mutableCopy = 深复制

    以下为单独介绍部分

    NSString 与 NSMutableString

    • 代码
    // __NSCFConstantString : 0x1037faa48
    NSString *s1 = @"321321321"; 
    
    // __NSCFConstantString : 0x1037faa48,浅复制,只拷贝指针
    NSString *cs1 = [s1 copy]; 
     
    // __NSCFString : 0x604000449780,深复制,开辟新的内存地址,不可变字符串 -> 可变字符串
    NSMutableString *ms1 = [s1 mutableCopy]; 
    
    // __NSCFString : 0x604000449780,方法变相证明了 NSString 通过 mutableCopy 生成了一个新的可变字符串
    [ms1 appendString:@"0000"]; 
    
    // __NSCFString : 0x60000005e330
    NSMutableString *ms = [NSMutableString stringWithString:@"fdasfda"]; 
    
    // NSTaggedPointerString : 0xa616466736164667,false深复制,开辟新的内存地址,可变字符串 -> 不可变字符串,如果执行可变字符串方法会崩溃 
    NSString *cms = [ms copy]; 
    
    // __NSCFString : 0x600000443000,深复制,开辟新的内存地址
    NSMutableString *mms = [ms mutableCopy]; 
    

    NSArray 与 NSMutableArray

    • 代码
    // __NSArrayI 0x604000221700
    NSArray *a = @[@1, @2]; 
    
    // __NSArrayI 0x604000221700,浅复制,只拷贝指针 
    NSArray *ca = [a copy]; 
    
    // __NSArrayM 0x60400024e010,深复制,开辟新的内存地址,不可变数组 -> 可变数组 
    NSMutableArray *ma = [a mutableCopy]; 
    
    // __NSArrayM 0x60400024e010,方法变相证明了 NSArray 通过 mutableCopy 生成了一个新的可变数组
    [ma addObject:@3]; 
    
    // __NSArrayM 0x600000246e40
    NSMutableArray *m = [NSMutableArray arrayWithObjects:@"a", @"b", nil]; 
    
    // __NSArrayI 0x600000039040,false深复制,可变数组 -> 不可变数组,如果执行可变数组方法会崩溃 
    NSArray *cm = [m copy]; 
    
    // __NSArrayM 0x600000246ea0,深复制,开辟新的内存地址 
    NSMutableArray *mm = [m mutableCopy]; 
    

    NSDictionary 与 NSMutableDictionary

    • 代码
    // __NSDictionaryI : 0x60400027f8c0
    NSDictionary *d = @{@"aa": @(11), @"bb": @(22)}; 
    
    // __NSDictionaryI : 0x60400027f8c0,浅复制,只拷贝指针
    NSDictionary *cd = [d copy]; 
    
    // __NSDictionaryM : 0x604000039260,深复制,开辟新的内存地址,不可变字典 -> 可变字典
    NSMutableDictionary *md = [d mutableCopy]; 
    
    // __NSDictionaryM : 0x604000039260,方法变相证明了 NSDictionary 通过 mutableCopy 生成了一个新的可变字典
    [md setObject:@(33) forKey:@"cc"]; 
    
    // __NSDictionaryM : 0x604000039460
    NSMutableDictionary *m = [NSMutableDictionary dictionaryWithDictionary:@{@"gg": @(88), @"hh": @(99)}]; 
    
    // __NSFrozenDictionaryM : 0x6040000394e0,false深复制,开辟新的内存地址,可变字典 -> 不可变字典,如果执行可变字典方法会崩溃
    NSDictionary *cm = [m copy]; 
    
    // __NSDictionaryM : 0x6040000394a0,深复制,开辟新的内存地址
    NSMutableDictionary *mm = [m mutableCopy]; 
    

    相关文章

      网友评论

        本文标题:iOS 中 Copy 与 MutableCopy 简单理解

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