美文网首页
iOS开发 对象传递复制

iOS开发 对象传递复制

作者: 星辰流转轮回 | 来源:发表于2018-06-04 14:33 被阅读43次

开发中有这么一种情况,详情页面 detailsVc 持有 model, 需要将model传给编辑页面 editVc ,然后在编辑页面修改

如果直接使用

editVc.model = self.model;

会出现这么一种情况: 在 editVc 中修改,不管是否保存,返回 detailsVc 页面,数据都会有变化,因为 model 在 editVc 中被修改了!

原因,看指针地址

因为我 model 写了懒加载,开始有个内存地址,但是赋值之后,内存地址变成了赋值model的内存地址, 也就是传递的时候,只是 detailsVc 将持有的 model 的指针,传给了 editVc 的model,并不是新建了一个值! editVc 修改model 修改的是指针指向的区域的值,导致了detailsVc 的 model  随着变化,避免这种情况,就需要用到copy.

editVc.model = self.model.copy;

但是直接这样写,会崩溃! 因为调用 copy 方法时,对象会调用 copyWithZone: 方法来实现赋值!

解决办法: 让对象实现 NSCopying 协议

- (id)copyWithZone:(NSZone*)zone

{

    ActionModel* model = [[selfclass]allocWithZone:zone];

    model.organizationShortName = self.organizationShortName;      

    model.organizationId = self.organizationId;     ...

    return model;

当然,属性太多,这样写也够累的,可以利用 runtime 完成

- (id)copyWithZone:(NSZone*)zone

{

    ActionModel* model = [[selfclass]allocWithZone:zone];

    unsignedintcount =0;

    Ivar* ivars =class_copyIvarList([ActionModelclass], &count);

    for(inti =0; i < count; i ++) {

        //取出属性的名称

        Ivarivar = ivars[i];

        constchar* name =ivar_getName(ivar);

        NSString* key = [NSStringstringWithUTF8String:name];

        //给属性赋值  利用KVC

        idvalue = [selfvalueForKey:key];

        [modelsetValue:valueforKey:key];

    }

    //C语言中需要释放指针

    free(ivars);

    return model;

}

 ps:  这里 不能 return self ! copy 我们只是新建了一个来一个个赋值上去, return self 的话,就是把原本的返回,而不是 copy 出来的新对象!

相关文章

  • iOS开发 对象传递复制

    开发中有这么一种情况,详情页面 detailsVc 持有 model, 需要将model传给编辑页面 editVc...

  • iOS

    开发记录 iOS 深复制与浅复制 浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址 ...

  • 对象的复制赋值

    目录 潜复制&深复制 值传递&引用传递 可变对象&不可变对象 赋值 对象的赋值实际上是对象的引用。当创建一个对象,...

  • Java随笔 - 对象克隆

    本文总结Java对象的浅复制和深复制,以及Clonable接口。 前言 对象在传递的时候,会进行对象复制。对象的复...

  • js 对象深度复制

    js 对象复制是地址传递, 而不是值传递, 可以使用如下方法进行``深度复制`

  • Flutter基础知识

    0、Dart是值传递还是引用传递? Dart是值传递。每次调用函数,传递过去的都是对象的内存地址,不是对象的复制。...

  • java SE

    问题一:Java中是引用传递还是值传递? 值传递:将方法实际参数值复制到另一个变量,然后复制的对象被传递,这就是为...

  • iOS 响应链

    iOS开发 - 事件传递响应链iOS 响应者链,事件的传递事件传递之响应链Cocoa Touch事件处理流程--响...

  • 【iOS开发】复制一个对象

    我们都知道,对象之间的传递是引用传递。例如有一个Apple类,有两个Apple实例对象a和b,其中a指向redAp...

  • Java值传递和引用传递

    Java中无论基础数据类型还是引用变量,Java参数传递都是值复制的传递过程.对于引用变量,复制指向对象的首地址

网友评论

      本文标题:iOS开发 对象传递复制

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