• 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];
    }

  • 相关阅读:
    ASP.NET Forums 2.0 修改集锦(一)
    在自己的应用程序中显示Windows关于对话框
    ASP.NET Forums 2.0 本地化修改(四)
    Flash对双字节的支持问题
    DotNetNuke 2.1.2安装指南
    ASP.NET Forums 2.0 本地化修改(五) 增加页面Meta标记的keywords和description
    ASP.NET Forums 2.0 本地化修改(三)
    JavaScript利用正则表达式自己写数字判断函数
    hash表基础知识(转载)
    求子数组的最大和
  • 原文地址:https://www.cnblogs.com/wangshengl9263/p/3072541.html
Copyright © 2020-2023  润新知