zoukankan      html  css  js  c++  java
  • 关于NScopying的问题

    如果让一个自定义类 能用定义copy属性的实例变量就需对该类接收nscopying协议

    //外界如果想要让person对象执行copy方法,必须接收NSCopying协议,实现协议里的方法,来定义copy的细节。

    //一个类可以接收多个协议,协议与协议之间用逗号隔开。所有的协议写在父类后面的尖括号内部。

    @interface Person : NSObject<SayHello, NSCopying>

     

    @property (nonatomic, copy) NSString *name;

    @property (nonatomic, copy) NSString *gender;

    @property (nonatomic, retain) NSMutableArray *mArr;

    并且在.m文件中红重写copyWithZone方法

    //伪拷贝,相当于没有拷贝,只是让外界的对象执行了一次retain操作。

    //- (id)copyWithZone:(NSZone *)zone {

    //    return [self retain];

    //}

     

    //浅拷贝

    //拷贝的是地址,对象两个,共用一份内容,改变其中一个对象实例变量的值,另外一个也会访问到改变之后的值。但是一定要注意,字符串如果指向常量区,那么改值相当于重指向,并不会影响另外一个对象的值。

    //- (id)copyWithZone:(NSZone *)zone {

    //    Person *person = [[Person allocWithZone:zone] init];

    //    person.name = self.name;

    //    person.gender = self.gender;

    //    person.mArr = self.mArr;

    //    return person;

    //}

     

    //深拷贝,对象两份,内容两份,改变其中一个的值,另外一个不会发生改变。

    //拷贝怎么实现,到底是深拷贝还是浅拷贝,取决于内部代码的实现。

    - (id)copyWithZone:(NSZone *)zone {

        Person *person = [[Person allocWithZone:zone] init];

        person.name = [self.name mutableCopy];

        person.gender = [self.gender mutableCopy];

        person.mArr = [self.mArr mutableCopy];

        return person;

    }

  • 相关阅读:
    重读SQLServer技术内幕 -- 故障检测概要
    Android Studio调试React Native项目
    Android 异常处理
    第一天
    记一次"未将对象引用设置到对象的实例"问题的排查过程
    Hyper-V连接虚拟机异常,“无法进行连接,因为可能无法将凭据发送到远程计算机”
    关于TFS2012无法发送警报邮件的问题
    BaseAdapter日常的封装
    android自定义拍照
    Android系统拍照源码
  • 原文地址:https://www.cnblogs.com/naizui/p/5096414.html
Copyright © 2011-2022 走看看