copy和mutableCopy的區別

/**

  • 一.系統非容器類對象

    1.對不可變對象復制:copy是指針復制、mutableCopy是對象復制
    2.可變對象復制:copy和mutableCopy都是對象復制,但是copy返回的對象是不可變的
    3.copy返回的是不可變的對象、mutableCopy返回的是可變的對象
    */

  • (void)NoContainerClassObjectCopyAndMutableCopyDifference {
    NSString *str = @"origion";
    NSString *strCopy = [str copy];
    NSLog(@"str=%p\nstrCopy=%p",str,strCopy);
    // str=0x100d452b8 strCopy=0x100d452b8
    // 結論:兩個的地址是一樣的,也就是str和strCopy指向的是同一塊內存區域

    NSMutableString *strMCopy = [str mutableCopy];
    [strMCopy stringByAppendingString:@"mutableCopy添加"];
    NSLog(@"str=%p\nstrCopy=%p",str,strMCopy);
    // str=0x100d452b8 strCopy=0x60800027a940
    // 結論:兩個是不一樣的地址,也就是說mutableCopy是真正意義上的復制,系統為其分配了新的內存

NSMutableString *mStr = [NSMutableString stringWithString:@"可變字符串"];
NSMutableString *mStrCopy = [mStr copy];
NSMutableString *mStrMCopy = [mStr mutableCopy];
NSLog(@"\nmStr=%p\nmStrCopy=%p\nmStrMCopy=%p",mStr,mStrCopy,mStrMCopy);
[mStrMCopy appendString:@"拼接的mutableCopy"];

// [mStrCopy appendString:@"拼接的copy"]; // 此方法會崩潰。因為copy成的是不可變的字符串
NSLog(@"mStrCopy=%@mStrMCopy=%@",mStrCopy,mStrMCopy);
// 結論:三者的地址是不一樣的,但是copy復制的返回的是不可變的對象
}

/**

  • 二、系統的容器類對象

    結論同系統的非容器類對象一樣
    */

  • (void)containerClassObjectCopyAndMutableCopyDifference {
    //copy返回不可變對象,mutablecopy返回可變對象
    NSArray *array = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
    NSArray *arrayCopy = [array copy];
    NSArray *arrayMCopy = [array mutableCopy];
    NSLog(@"\narray=%p\narrayCopy=%p\narrayMCopy=%p",array,arrayCopy,arrayMCopy);
    // 結論:array和arrayCopy的地址是一樣的,array和arrayMCopy的地址是不一樣的
    // 則對于不可變對象的copy是指針復制,mutableCopy是對象復制
NSMutableArray *mArray = [@[@"sd",@"sdf"] mutableCopy];
NSMutableArray *marrayCopy = [mArray copy];
NSMutableArray *marrayMCopy = [mArray mutableCopy];
NSLog(@"\nmArray=%p\nmarrayCopy=%p\nmarrayMCopy=%p",mArray,marrayCopy,marrayMCopy);
// 結論:mArray、marrayCopy、marrayMCopy的地址都不一樣,也就是說copy和mutableCopy都是對象復制
[marrayMCopy addObject:@"啦啦啦"];
[marrayCopy addObject:@"哈哈"]; // 會崩潰。copy返回的是不可變的

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容