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;  

     

     

  • 相关阅读:
    Andorid之官方导航栏Toobar
    使用ECharts实现数据图表分析
    内存优化之封装九宫格
    xUtils框架的使用详解
    IOS 生成本地验证码
    android之官方导航栏ActionBar(三)之高仿优酷首页
    Android官方导航栏ActionBar(二)—— Action View、Action Provider、Navigation Tabs的详细用法
    IOS 实现界面本地化(国际化)
    Windows7 64位压缩包安装MySQL5.7.9
    Debian 8.2 下安装MySQL5.7.9 Generic Binaries
  • 原文地址:https://www.cnblogs.com/IOS-Developer/p/4173167.html
Copyright © 2011-2022 走看看