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)方式可以避免这样的情况发生。
网友评论