------------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!---------------------------
copy语法的目的:改变副本的时候,不会影响到源对象
首先了解两个概念:浅拷贝、深拷贝。浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
字符串的拷贝有四种:
(1)不可变字符串的mutableCopy -> 深拷贝
(2)不可变字符串的copy -> 浅拷贝
(3)可变字符串的mutableCopy -> 深拷贝
(4)可变字符串的copy -> 深拷贝
以下代码展示了字符串之间的4种拷贝关系:#pragma mark 演示字符串的拷贝(深拷贝)
// 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
void stringMutableCopy() {
// string:1
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
// 产生了一个新的对象,计数器为1。源对象的计数器不变。
// str:1
// string:1
NSMutableString *str = [string mutableCopy];
// str和string不是相同对象
// NSLog(@"%i", str == string);
[str appendString:@" abcd"];
//新对象的改变不会影响源对象
NSLog(@"string:%@", string);
NSLog(@"str:%@", str);
// str:0
[str release];
// string:0
[string release];
}
#pragma mark 演示字符串的拷贝(浅拷贝)
// 只有一种情况是浅拷贝:不可变对象调用copy方法时
// 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
void stringCopy() {
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
NSLog(@"%zi", [string retainCount]);
// copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身
// 源对象计数器会+1
// 在浅拷贝情况下,copy其实就相当于retain
NSString *str = [string copy];
NSLog(@"%zi", [string retainCount]);
//打印结果为1,说明是指向相同的对象
NSLog(@"%i", str == string);
[str release];
[string release];
}
#pragma mark 可变字符串的copy(深拷贝)
void mutableStringCopy() {
NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
// 会产生一个新对象,str计数器为1
NSString *str = [string copy];
[str release];
}
#pragma mark 可变字符串的MutableCopy(深拷贝)
void mutableStringMutableCopy() {
NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
// 会产生一个新对象,str计数器为1
NSMutableString *str = [string mutableCopy];
[str appendString:@"1234"];
//新对象的改变不会影响源对象
NSLog(@"str:%@", str);
NSLog(@"string:%@", string);
[str release];
}
-----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!-------------------------
详细请查看:www.itheima.com