美文网首页
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开发 对象传递复制

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