zoukankan      html  css  js  c++  java
  • 浅拷贝和深拷贝

    浅拷贝和深拷贝

     

    目录

    • 对浅拷贝和深拷贝的理解
    • 浅拷贝
    • 深拷贝
    • NSDictionary的深拷贝

     

     对浅拷贝和深拷贝的理解

     

    浅拷贝

    不是深拷贝的拷贝都是浅拷贝

     

    深拷贝

    如果想使用copy则需要遵循NSCopying协议,如果是想使用mutableCopy则需要遵循NSMutableCopying协议

    分别需要实现的方法

    - (id)copyWithZone:(NSZone *)zone{ MyClass *myClass = [[self class] allocWithZone:zone] init]; 对新创建的对象进行copy/mutableCopy赋值; return myClass;}

    - (id)mutableCopyWithZone:(NSZone *)zone{ MyClass *myClass = [[self class] allocWithZone:zone] init]; 对新创建的对象进行copy/mutableCopy赋值; return myClass;}

    如果类里面又包含其他类对象,则需要对这些类对象的类实现NSCopying协议或者NSMutableCopying协议,如此类推

     

    NSDictionary的深拷贝

    -(NSMutableDictionary *)mutableDeepCopy  

    {  

        NSMutableDictionary *dict=[[NSMutableDictionary alloc] initWithCapacity:[self count]];  

    //新建一个NSMutableDictionary对象,大小为原NSDictionary对象的大小  

    NSArray *keys=[self allKeys];  

    for(id key in keys)  

        { //循环读取复制每一个元素  

            id value=[self objectForKey:key];  

            id copyValue;  

    if ([value respondsToSelector:@selector(mutableDeepCopy)]) {  

    //如果key对应的元素可以响应mutableDeepCopy方法(还是NSDictionary),调用mutableDeepCopy方法复制  

                copyValue=[value mutableDeepCopy];  

            }else if([value respondsToSelector:@selector(mutableCopy)])  

            {  

                copyValue=[value mutableCopy];  

            }  

    if(copyValue==nil)  

    copyValue=[value copy];  

     

    [dict setObject:copyValue forKey:key];  

        }  

    return dict;  

     

     

  • 相关阅读:
    mysql--连接查询(内外连接)
    Mysql--select基础查询
    Mysql--数据定义语言(DDL)
    Mysql--数据操作语言(DML)
    java--String、StringBuilder、StringBuffer的解析和比较?
    Java--equals和 == 的比较和equals()、HashCode()的重写
    Mysql--数据类型
    Mysql--约束
    SpringCloud版本说明
    springBoot 发送邮件
  • 原文地址:https://www.cnblogs.com/IOS-Developer/p/4173167.html
Copyright © 2011-2022 走看看