1. 程式人生 > >MRC Copy 與MutableCopy的區別

MRC Copy 與MutableCopy的區別

拷貝的目的:產生一個副本,跟原物件之間互不影響。即修改原物件(或者副本)不會影響副本(或原物件)。

深拷貝:生成一個新的物件,叫深拷貝

淺拷貝:複製一個新的指標指向同一個物件,叫淺拷貝

NSString *str1 = [[NSString alloc]initWithFormat:@"123"];
        //copy mutableCopy 相當於alloc 一次,需要release
        NSString *str2 = [str1 copy ];//淺拷貝
        NSMutableString *str3 = [str1 mutableCopy];//深拷貝
        NSLog(@"%p-%p-%p",str1,str2,str3);
        
        [str2 release];
        [str3 release];
        [str1 release];

列印結果如下:

0x33323135-0x33323135-0x100531f60

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 NSMutableString *str1 = [[NSMutableString alloc]initWithFormat:@"123"];
    //copy mutableCopy 相當於alloc 一次,需要release
    NSString *str2 = [str1 copy ];//深拷貝
    NSMutableString *str3 = [str1 mutableCopy];//深拷貝
    NSLog(@"%p-%p-%p",str1,str2,str3);
    
    [str2 release];
    [str3 release];
    [str1 release];

列印如下:0x100400270-0x33323135-0x1004131a0

 

  copy mutableCopy
NSString

NSString

淺拷貝

NSMutableString

深拷貝

NSMutableString

NSString

深拷貝

NSMutableString

深拷貝

NSArray

NSArray

淺拷貝

NSMutableArray

深拷貝

NSMutableArray

NSArray

深拷貝

NSMutableArray

深拷貝

NSDictionary

NSDictionary

淺拷貝

NSMutableDictionary

深拷貝

NSMutableDictionary

NSDictionary

深拷貝

NSMutableDictionary

深拷貝

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

@interface XZperson : NSObject
//使用copy修飾,生成不可變副本
@property(nonatomic,copy)NSMutableArray *dataArry;

@property(nonatomic,strong)NSArray *datas;

@end

#import "XZperson.h"

@implementation XZperson

@end
 

 

一. main.m 中來研究問題1所在.

 XZperson *p = [[XZperson alloc]init];
        p.dataArry = [NSMutableArray array];
        [p.dataArry addObject:@"kk"];

//執行結果如下

[__NSArray0 addObject:]: unrecognized selector sent to instance 0x100409630
 

原因分析:使用copy 會讓dataArry生成不可變副本;

二 . main.m 中來研究問題2

XZperson *p = [[XZperson alloc]init];
        p.datas = @[@"hehe",@"heihei"];
        NSMutableArray *arrM = [NSMutableArray arrayWithObjects:@"jack",@"rose", nil];
        p.datas = arrM;
        [arrM addObject:@"lili"];
        NSLog(@"%@-%@",[p.datas class],p.datas);

//列印結果如下

__NSArrayM    -      (  jack,    rose,  lili  )
原陣列datas使用strong修飾,原來的陣列型別由不可變變成了可變,且當不可變datas 賦值可變陣列之後,對可變陣列的內容進行修改也會直接影響不可變datas的初始值。