Bootstrap

深拷贝与浅拷贝

以后定义属性 , 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];

;