深拷贝与浅拷贝

来源:互联网 发布:淘宝短发女模特叫什么 编辑:程序博客网 时间:2024/06/05 05:45
以后定义属性,NSString ,NSarray ,NSDitionary,copy比写retain更安全,防止外界给你赋值一个可变对象,赋值完之后对可变对象做修改,会导致已经赋过值的也会被改动,使用copy的话,内不会拷贝出一个新对象,源对象做修改,赋值过的不变
郑重警告:此种方法,不适用于NSMutableString,NSMutableArray,NAMutableDitionary,NSMutableset,因为一旦赋值,就会拷出一个不可变的对象,就不能修改内容了

对于NSString ,NSArray ,NSDictionary ,NSSet,对于copy是浅拷贝(拷贝指针),copy相当于retain
对于NSString ,NSMUtableArray,NSMutableDictionary, NSMUtableSet ,对它拷贝是深拷贝(拷贝内容),会拷出一个新对象,拷贝出的新对象是不可变对象

对于NSString ,对它是浅拷贝(拷贝指针),copy相当于retain
对于NSString ,对它拷贝是深拷贝(拷贝内容),会拷出一个新对象,拷贝出的新对象是不可变对象
   
浅拷贝 (拷贝需要遵守 NSCopying协议)
    NSString * string = [NSString stringWithFormat:@"
蓝鸥"];
    NSLog(@"%lu",[string retainCount]);
    NSLog(@"%p",string);
   
    NSString * newString = [string copy];
    NSLog(@"new %lu",[newString retainCount]);
    NSLog(@"%p",newString);                                 //
仅仅是引用计数加1,地址没变


深拷贝,内容不可变
    NSMutableString * string1 = [NSMutableString stringWithFormat:@"
蓝鸥科技"];
    NSLog(@" %lu ",[string1 retainCount]);
    NSLog(@"%p",string1);
    NSString * newString1 = [string1 copy];
  [newString1 deleteCharactersInRange:NSMakeRange(2, 2)];  //
不可变的不可以删除
    NSLog(@" new1 %lu ",[newString1 retainCount]);
    NSLog(@"%p",newString1);
   
   
对于mutableCopy,是是深拷贝,会拷贝出一个新对象,新对象是可变的
不可变的   新对象是可变的
    NSString * string2 = [NSString stringWithFormat:@"
蓝鸥科技"];
    NSLog(@" %lu ",[string2 retainCount]);
    NSLog(@"%p",string2);
    NSMutableString * newString2 = [string2 mutableCopy];
    [newString2 deleteCharactersInRange:NSMakeRange(2, 2)];
    NSLog(@"new2  %lu ",[newString2 retainCount]);
    NSLog(@"new2 %p",newString2);
   
可变的   新对象是可变的
    NSMutableString * string3 = [NSMutableString stringWithFormat:@"
蓝鸥科技"];
    NSLog(@" %lu ",[string3 retainCount]);
    NSLog(@"%p",string3);
    NSMutableString * newString3 = [string3 mutableCopy];
    [newString3 deleteCharactersInRange:NSMakeRange(2, 2)];
    NSLog(@"new3  %lu ",[newString3 retainCount]);
    NSLog(@"new3 %p",newString3);
 
    NSMutableString * string = [NSMutableString stringWithFormat:@"
蓝鸥科技"];
    Person * person = [[Person alloc] init];
    person.name = string;
    [string deleteCharactersInRange:NSMakeRange(2, 2)]; //
若是retain,赋给可变的,删除会影响给name赋值
    [person sayHI];
    [person release];

0 0
原创粉丝点击