以后定义属性
,
逢
NSString ,NSarray ,NSDitionary,
写
copy
比写
retain
更安全
,
防止外界给你赋值一个可变对象
,
赋值完之后对可变对象做修改
,
会导致已经赋过值的也会被改动
,
使用
copy
的话
,
内不会拷贝出一个新对象
,
源对象做修改
,
赋值过的不变
郑重警告 : 此种方法 , 不适用于 NSMutableString,NSMutableArray,NAMutableDitionary,NSMutableset, 因为一旦赋值 , 就会拷出一个不可变的对象 , 就不能修改内容了
郑重警告 : 此种方法 , 不适用于 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];
对于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];