iOS Developer

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

2017-08-11  本文已影响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)方式可以避免这样的情况发生。

上一篇下一篇

猜你喜欢

热点阅读