zoukankan      html  css  js  c++  java
  • 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];
    }

  • 相关阅读:
    485串口接线
    mvc3 升级mvc5
    VB连接ACCESS数据库,使用 LIKE 通配符问题
    VB6 读写西门子PLC
    可用的 .net core 支持 RSA 私钥加密工具类
    解决 Win7 远程桌面 已停止工作的问题
    解决 WinForm 重写 CreateParams 隐藏窗口以后的显示问题
    解决安装 .net framework 发生 extracting files error 问题
    CentOS7 安装配置笔记
    通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法
  • 原文地址:https://www.cnblogs.com/wangshengl9263/p/3072541.html
Copyright © 2011-2022 走看看