zoukankan      html  css  js  c++  java
  • copy-mutableCopy

      copy和mutableCopy语法的目的:改变副本的时候,不会影响到源对象;调用Copy产生的对象是不可变的,调用mutableCopy产生的对象是可变的,与调用对象是否可变无关。

      Copy 需要先实现NSCoppying协议,创建的是不可变副本(如字符串、数组、字典)。

      mutableCopy 需要先实现NSMutableCopying协议,创建的是可变副本(如可变字符串、可变数组、可变字典)。

      如果想自定义copy,那么就必须遵守NSCopying,并且实现copyWithZone:方法。

      如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现mutableCopyWithZone:方法。

    1、不可变字符串的mutableCopy(深拷贝):// 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
    NSMutableString *str = [string mutableCopy]; // 产生了一个新的对象,计数器为1。源对象的计数器不变; str和string不是相同对象。

    2、不可变字符串的copy(浅拷贝):// 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。只有一种情况是浅拷贝:不可变对象调用copy方法时。

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
    NSString *str = [string copy]; // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身; 源对象计数器会+1; 在浅拷贝情况下,copy其实就相当于retain.

    3、可变字符串的copy(深拷贝):

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

    4、可变字符串的MutableCopy(深拷贝):

    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
    NSMutableString *str = [string mutableCopy]; //会产生一个新对象,str计数器为1。

    5、@property中的参数copy策略:

    @property (nonatomic, copy) NSString *name;
    // copy代表set方法会release旧对象、copy新对象
    // 修改外面的变量,并不会影响到内部的成员变量
    // 建议:NSString一般用copy策略,其他对象一般用retain

    6、对象的copy:

    Student *stu1 = [Student studentWithName:@"stu1"];
    Student *stu2 = [stu1 copy];
  • 相关阅读:
    java 面试每日一题2
    java 面试每日一题
    java GUI画满天星
    java JPEGImageEncoder;图像处理
    spring mvc+myBatis配置详解
    myeclipse 常用快捷键总结
    Java 如何快速序列化
    java UUID
    vue +echarts树状图
    在线预览(pptx、ppt、pps、docx、doc、xlsx、xls)
  • 原文地址:https://www.cnblogs.com/CJDog/p/5127467.html
Copyright © 2011-2022 走看看