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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,653评论 30 472
  • 回溯项目还可以,不完善还没有进度百分比先保存着 其他平台的一些demohttps://code.hcharts.c...
    北方蜘蛛阅读 23,510评论 6 2
  • 深圳,阴天。今天是我生日,没有喝酒,身体虚弱,大脑有点空白。我已经完全不记得去年生日是怎么过的了,应该是一个蛋糕搞...
    Echo可可阅读 181评论 0 0
  • 少小离家老大回,乡音未改鬓毛衰。 儿童相见不相识,笑问客从何处来。 离别家乡岁月多,近来人事半消磨。 唯有门前镜湖...
    脆弱的踢脚线阅读 359评论 0 1
  • 在茫茫人海中 在时间无涯的荒野里 我还是会奢侈的幻想 希望遇到一个会弹吉他的温暖小哥 希望他把自己讲给我听 希望他...
    臭脾气小姐阅读 180评论 0 0

友情链接更多精彩内容