zoukankan      html  css  js  c++  java
  • iOS copy mutableCopy 的实现

    一个对象可以调用copy或mutableCopy方法来创建一个副本对象。
    1、copy:创建的时不可变副本
    (如NSString、NSArray、NSDictionary)。
    比如把一个对象添加字典的键值对中时,将导致调用该对象的copy方法,
    而copy方法在NSObject中的实现中,将调用该对象的copyWithZone方法(NSCopying协议方法)

    所以,可以不用重写copy方法,只需实现copyWithZone即可。
    copyWithZone方法应该返回一个不可变副本。
    2、mutableCopy:创建的可变副本
    (如NSMutableString、NSMutableArray、NSMutableDictionary)

    使用copy功能的前提:

    1、copy:需要遵守NSCopying协议,
    实现copyWithZone:方法。

    2、mutableCopy : 需要遵守NSMutableCopying协议,
    实现mutableCopyWithZone:

    深复制和浅复制的区别:
    深复制(深拷贝、内容拷贝、deep copy):

    特点:1、源对象和副本对象是不同的两个对象; 

    2、源对象引用计数器不变,副本对象计数器为1(因为是新产生的)。

    本质:产生了新对象。

    浅复制(浅拷贝、指针拷贝、shallow copy):

    特点:1、源对象和副本对象是同一对象; 

    2、源对象(副本对象)引用计数器+1,相当于做一次retain操作。

    本质:没有产生新对象

    不论源对象是否可变,copy复制出的对象都是不可变对象
    不论源对象是否可变,mutableCopy复制出的对象都是可变对象
    只有不可变对象的copy方式,是浅复制,其他都是深复制。

    注意,以上结论仅对于字符串、数组和字典
    自定义对象的复制效果取决于对应copy协议方法的实现。

    另附模型copy的demo

    car.h

    #import <Foundation/Foundation.h>
    
    @interface car : NSObject<NSCopying>
    @property (nonatomic , copy) NSString * name;
    @property (nonatomic,copy) NSString * age;
    @end

    car.m

    #import "car.h"
    
    @implementation car
    - (instancetype)copyWithZone:(nullable NSZone *)zone{
        car * tmp = [[car alloc]init];
        tmp.age = self.age;
        tmp.name = self.name;
        return  tmp;
    }
    @end

    现实模型的深拷贝

  • 相关阅读:
    【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例
    【Java基础】1、java中的instanceof
    【Java面试】1、基础知识篇
    【github&&git】3、git图像化界面GUI的使用
    【github&&git】2、github入门到上传本地项目
    Spring Boot属性配置文件详解
    微服务Spring Cloud与Kubernetes比较
    导入时如何定制spring-boot依赖项的版本
    spring容器ApplicationContext初始化(spring应用上下文初始化)
    spring概念简介、bean扫描与注册实现方式
  • 原文地址:https://www.cnblogs.com/Sico2Sico/p/5384191.html
Copyright © 2011-2022 走看看