zoukankan      html  css  js  c++  java
  • copy和mutableCopy简单说明

    copy和mutableCopy

    • copy
      • 只会产生不可变的副本对象(比如NSString)
    • mutableCopy
      • 只会产生可变的副本对象(比如NSMutableString)
    • copy和mutableCopy来自NSObject,适用于所有的对象

    copy和mutableCopy拷贝系统对象

    源对象类型拷贝方法副本对象类型是否产生了新对象拷贝类型
    NS* copy NS* 浅拷贝
    NS* mutableCopy NSMutable* 深拷贝
    NSMutable* copy NS* 深拷贝
    NSMutable* mutableCopy NSMutable* 深拷贝
    • 注:*是通配符,比如NSString,NSMutableString,NSArray,NSMutableArray, NSDictionary,NSMutableDictionary
    • 注:深拷贝 == 内容拷贝;浅拷贝 == 指针拷贝;

    copy拷贝自定义对象

    • 首先自定义对象需要遵守协议<NSCopying>
    • 需要重写方法-(id)copyWithZone:(NSZone *)zone,返回自定义的对象
    • [person copy];copy方法内部会调用-(id)copyWithZone:(NSZone *)zone
    • copy方法拷贝的自定义对象是可变的
      -(id)copyWithZone:(NSZone *)zone
      {
        // zone是系统已经分配好的内存空间
        ZMJPerson *person = [ZMJPerson allocWithZone:zone] init];
        person.age = self.age;
        person.money = self.money;
        return person;
      }

    mutableCopy拷贝自定义对象

    • 首先自定义对象需要遵守协议<NSMutableCopying>
    • 其次需要重写方法- (id)mutableCopyWithZone:(NSZone *)zone
    • 但一般没有必要使用mutableCopy拷贝自定义对象,因为使用copy方法拷贝的自定义对象也是可变的,两个方法的作用一样,一般使用copy拷贝自定义对象

    copy和strong在@property参数中使用的比较

    @property (nonatomic, strong) NSString *name;
    @property (nonatomic, copy) NSString *name;
    • 如果使用strong,对应的name属性的setter方法是直接赋值(指针拷贝)
        - (void)setName:(NSString *)name
        {
          _name = name;
        }
    • 如果使用copy,对应的name属性的setter方法是先将name对象拷贝(有可能指针拷贝,有可能是内容,取决于具体的对象),然后赋值
        - (void)setName:(NSString *)name
        {
          _name = [name copy];
        }

    copy在@property参数中使用的注意点

    • 以下代码会出现严重的问题
      @property (nonatomic, copy) NSMutableString *name;
    • 分析
      • copy拷贝的对象永远是不可变的,也就是name对象是不可变的,因为它内部赋值方式是_name = [name copy];
      • 使用NSMutableString声明可变的指针指向不可变的name字符串对象,极其不合理,外界以为是NSMutableString类型,一旦调用appendString:方法,会直接报错,因为name对象本质是不可变的;
  • 相关阅读:
    Thinkphp M方法出错,D方法却可以
    Composer项目安装依赖包
    wamp httpd-vhosts.conf
    博客园报错 Mixed Content: The page at 'https://i.cnblogs.com/EditPosts.aspx?opt=1' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://upload.cnblogs.com/imageuploa
    Thinkphp js、css压缩类minify
    Thinkphp 不足之处
    Thinkphp 调试方法
    Lavavel 程序报错 MassAssignmentException in Model.php line 452: _token
    Laravel 安装mysql、表增加模拟数据、生成控制器
    Laravel 安装登录模块
  • 原文地址:https://www.cnblogs.com/pioneerMax/p/6292112.html
Copyright © 2011-2022 走看看