zoukankan      html  css  js  c++  java
  • ios copy

    浅拷贝:一个强指针,一个弱指针同时指向一个空间,强引用的对象释放后,弱引用跟着指向空指针

    引用计数拷贝:避免了浅拷贝和深拷贝的缺点,被大量使用
    两个强指针指向同一空间

    以上两者是共用同一块空间,优点,节省存储空间

    深拷贝:
    最大的特点:两个指针各自有自己的存储空间
    优点:两个指针互不干扰
    缺点:耗费的存储空间大

    1. 浅拷贝:

    2个指针同时指向一空间,一个释放了,另一个也被迫释放(强引用+弱引用),节省存储空间(强引用的空间释放了弱引用指针则为空)

    TRStudent *s1 = [[TRStudent alloc]init];
    __weak TRStudent *s2 = s1 ; 
    
    2. 引用计数的拷贝:

    2个指针同时指向一空间,一个释放了,另一个不被迫释放(强引用+强引用)

    TRStudent *s1 = [[TRStudent alloc]init];
    TRStudent *s2 = s1 ; 
    

    以上为同一存储空间

    深拷贝:2个不同的存储空间 (面试题)
    int p1 = (int)malloc(4);
    *p1 = 10;
    int *p2 = (int *)malloc(4);
    *p2 *p1;

    3. 深拷贝:

    NSCopyiny协议:
    1 自定义类实现深拷贝时,需要采纳 NSCopying 协议
    2 在自定义的.m文件中实现NSCopying协议中的方法 copyWithZone
    3 在主函数中,用copy方法实现深拷贝,该方法在函数体中,会自动调用copyWithZone方法
    4 copy可以作为property的参数,使属性赋值时得到的是副本(深拷贝)

    三部曲:

    采纳<NSCopyiny>,  实现函数体(重写),  调用[b1 copy]得到副本
    
    // 1.在.h文件中采纳<NSCopyiny>:
    @interface TRStudent : NSObject<NSCopying>
    
    // 2.实现函数体(重写)与工厂方法很像;
    不用放入__autirelaesing
    alloc不同  ->allocWithZone
    带参初始化用self.xxx
    -(id)copyWithZone:(NSZone *)zone{
        TRCicle *c = [[TRCicle allocWithZone:zone]initWithRadius:self.radius andOrgin:self.center];
        return c;
    }
    -(id)copy{
    ….
    id obj = [self copyWithZone]; //方法调用
    …
    return obj;
    }
    
    // 3.调用[b1 copy]得到副本:
    TRCicle  *c2 = [c1 copy];
    
    成功的三大原则: 1、坚持 2、不要脸 3、坚持不要脸
  • 相关阅读:
    [PHP] 适配器模式的日常使用
    [MySQL] timestamp和datetime的区别和大坑
    [PHP] foreach循环的引用赋值可能导致的问题
    [PHP] 邮件发送mail()函数失败问题 sendmail命令与postfix
    [日常] 腾讯云发送邮件失败问题
    [日常] 正则表达式 小括号() 中括号[] 大括号{}
    [Linux] awk与posix字符集
    [PHP] 工厂模式的日常使用
    [PHP] 抽象类abstract的回顾
    [日常]灵活的频率限制实现
  • 原文地址:https://www.cnblogs.com/xulinmei/p/7420108.html
Copyright © 2011-2022 走看看