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];
  • 相关阅读:
    【leetcode】1215.Stepping Numbers
    【leetcode】1214.Two Sum BSTs
    【leetcode】1213.Intersection of Three Sorted Arrays
    【leetcode】1210. Minimum Moves to Reach Target with Rotations
    【leetcode】1209. Remove All Adjacent Duplicates in String II
    【leetcode】1208. Get Equal Substrings Within Budget
    【leetcode】1207. Unique Number of Occurrences
    【leetcode】689. Maximum Sum of 3 Non-Overlapping Subarrays
    【leetcode】LCP 3. Programmable Robot
    【leetcode】LCP 1. Guess Numbers
  • 原文地址:https://www.cnblogs.com/CJDog/p/5127467.html
Copyright © 2011-2022 走看看