Copy与MutableCopy

MutableCopy:产生了一个新对象, 计数器为1, 源对象保持不变, 深拷贝

Copy:产生不可变副本, 由于源对象本身不可变, 所以直接返回源对象本身, 浅拷贝, 指针拷贝, 不会产生新的对象。

NSString一般用copy策略,其他对象一般用retain。

第一种: 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
void stringMutableCopy() {
    // string:1
    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
   
    // 产生了一个新的对象,计数器为1。源对象的计数器不变。
    // str:1
    // string:1
    NSMutableString *str = [string mutableCopy];
    //NSLog(@"str:%zi", [str retainCount]);
    //NSLog(@"string:%zi", [string retainCount]);
   
    // str和string不是相同对象
    // NSLog(@"%i", str == string);
   
    [str appendString:@" abcd"];
   
    NSLog(@"string:%@", string);
    NSLog(@"str:%@", str);
   
    // str:0
    [str release];
    // string:0
    [string release];
}

第二种: 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。

// 只有一种情况是浅拷贝:不可变对象调用copy方法时

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]);
   
    // NSLog(@"%i", str == string);
   
    [str release];
    [string release];
}

第三种: 可变字符串的copy(深拷贝)

void mutableStringCopy() {
    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
   
    // 会产生一个新对象,str计数器为1
    NSString *str = [string copy];
   
    [str release];
}

第四种: 可变字符串的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];
}

原文地址:https://www.cnblogs.com/wangshengl9263/p/3072541.html