美文网首页iOS Developer
ios 将一个对象的值赋值给另一个对象

ios 将一个对象的值赋值给另一个对象

作者: 东岳哥哥 | 来源:发表于2017-08-11 10:45 被阅读0次

    iOS 将一个对象的值赋值给另一个对象
    时间:2017年8月10日 周四

    有多种方式,提供三种思路:

    1、实现NSCopying协议:对象是新的内存地址;
    2、将对象转成字典数据,在用yymodel转成模型对象:对象是新的内存地址;
    3、直接一个属性一个属性赋值:对象的内存地址不变;
    

    分析:
    假如A、B两个对象,要将A的值赋值给B,
    使用1、2方法的话,是改变了B的内存地址;使用方法3,B的内存地址是没变的

    1、对象Copy的实现步骤:

    1)在Class @interface上声明NSCopying协议,
    2)在Class @implementation中实现协议方法- (id)copyWithZone:(NSZone *)zone
    使用runtime,避免一个一个属性的去赋值
    #import <objc/runtime.h>

    #import <objc/runtime.h>
    
    - (id)copyWithZone:(NSZone *)zone {
        PassengerModel *model = [[self class] allocWithZone:zone];
        unsigned int count = 0;
        objc_property_t *properties = class_copyPropertyList([PassengerModel class], &count);
        for (int i = 0; i < count; i++) {
            const char *name = property_getName(properties[i]);
            NSString *propertyName = [NSString stringWithUTF8String:name];
            id propertyValue = [self valueForKey:propertyName];
            if (propertyValue) {
                [model setValue:propertyValue forKey:propertyName];
            }
        }
        free(properties);
        
        return model;
    }
    

    注意:下面写的方式是错误的,没有实现copy

    - (id)copyWithZone:(NSZone *)zone{
        return self;
    }
    
    2、将对象转成字典数据,在用yymodel转成模型对象

    直接使用yymodel就可以了

    3、直接一个属性一个属性赋值

    将B对象的值,赋值给A对象,没有改变A对象的内存地址。

    #import <objc/runtime.h>
    //恢复数据
    - (void)recoverDataByorigionModel:(PassengerModel *)model {
        unsigned int count = 0;
        objc_property_t *properties = class_copyPropertyList([PassengerModel class], &count);
        for (int i = 0; i < count; i++) {
            const char *name = property_getName(properties[i]);
            NSString *propertyName = [NSString stringWithUTF8String:name];
            id propertyValue = [model valueForKey:propertyName];
            if (propertyValue) {
                [self setValue:propertyValue forKey:propertyName];
            }
        }
        free(properties);
    }
    
    有一种情景:
    
    1)VC1下列表有A对象,点击列表对A进行修改,将A对象传给VC2;
    2)在VC2中对A对象进行修改,改着改着,发现不对了,直接退出VC2;
    3)因为VC1也引用对象A,在VC2中已对A改动了,那么在VC1中的拿到A数据也是改动了的数据,
    但是,期望的结果是直接退出的话,数据没有改动。
    
    

    有两种处理方式:
    1)在给VC2传递A对象的时候,就copy一份A对象,就可以避免这样的问题处理,(使用方式1或2)
    2)直接A对象传值给VC2,在VC2内部copy一份A对象,假定为B对象,当用户直接退出VC2时,把B对象值赋值回给A对象,(使用方式1+3)
    注意:1)方式的话,在他人使用的时候,很容易忽略要copy A对象,就是直接VC.B = A;2)方式可以避免这样的情况发生。

    相关文章

      网友评论

        本文标题:ios 将一个对象的值赋值给另一个对象

        本文链接:https://www.haomeiwen.com/subject/hbfhrxtx.html