美文网首页iOS技术专题iOS
iOS对自定义对象深拷贝

iOS对自定义对象深拷贝

作者: 杨帅iOS | 来源:发表于2016-12-15 10:28 被阅读2087次

开发中会遇到控制器A传递model到控制器B的情况,但是如果直接赋值的话,控制器B更改了model数据,控制器Amodel数据也会改变.因为控制器A和B操作的model实质上是同一块内存地址

相同的地址

要避免这种情况赋值时就要对model对象进行深拷贝.也就是新开辟一个内存地址,再复制一份内容.

首先要你要给你需要深拷贝的自定义对象遵守NSCopying,NSMutableCopying协议,不然当DemoModel对象执行copy和mutableCopy时会崩溃

.h文件中

@interface DemoModel : NSObject<NSCopying,NSMutableCopying>

@property (nonatomic,assign) NSInteger age;

@property (nonatomic,  copy) NSString * name;

.m文件中 实现copyWithZone mutableCopyWithZone 方法

- (id)copyWithZone:(NSZone *)zone{

DemoModel * model = [[DemoModel allocWithZone:zone] init];

model.age = self.age;//self是被copy的对象

model.name = self.name;

return model;

}

- (id)mutableCopyWithZone:(NSZone *)zone{

DemoModel * model = [[DemoModel allocWithZone:zone] init];

model.age = self.age;//self是被copy的对象

model.name = self.name;

return model;

}

这样我们赋值时需要深拷贝的对象调用copy或mutableCopy方法就会跳转到我们上面实现的copyWithZone或mutableCopyWithZone对对象进行了深拷贝.我们打印地址会发现地址已经改变了.

地址改变了

相关文章

  • 深拷贝浅拷贝

    参考链接: ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍 - daiyelang的专栏 - 博客频...

  • oc 浅拷贝与深拷贝

    1. 先说结论: 分可变对象、不可变对象、自定义对象、容器对象几种: 例子参考: iOS开发——深拷贝与浅拷贝详...

  • iOS对自定义对象深拷贝

    开发中会遇到控制器A传递model到控制器B的情况,但是如果直接赋值的话,控制器B更改了model数据,控制器Am...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • 如何实现数组的深拷贝

    概念 iOS中有深拷贝和浅拷贝的概念,其中,浅拷贝并不拷贝对象本身,只是把指向对象的指针进行拷贝,该对象的引用系数...

  • IOS

    一、IOS基础 1、浅拷贝与深拷贝浅拷贝:拷贝对象的指针成员变量和原对象的指针成员变量指向同一块内存空间。深拷贝:...

  • OC基础之深拷贝和浅拷贝

    前言 深拷贝和浅拷贝在iOS面试中会经常的出现,作为对OC基础的一种考察,通常的回答就是:深拷贝是对于整个对象的拷...

  • 深入理解OC面向对象

    目录 1.面向对象1.三要素2.属性 2.深拷贝与浅拷贝1.Foundation框架中的对象2.自定义对象 3.对...

  • 深拷贝和浅拷贝

    浅拷贝 浅拷贝是对一个对象的顶层拷贝 深拷贝 深拷贝是对于一个对象所有层次的拷贝(递归) 拷贝的其他方式 浅拷贝对...

  • 关于iOS中的深拷贝和浅拷贝

    记录我的第一篇技术文章。说说iOS中的深拷贝和浅拷贝吧。 iOS中,简单的说,深拷贝会拷贝生成一个新的对象...

网友评论

  • 风火游龙:model的属性有一个数组,数组里面又装着4个student模型,应该咋整,谢谢赐教
    风火游龙:@Danile杨 谢谢,已经完美解决了
    杨帅iOS:你可以循环对四个student模型进行深拷贝 然后用接受值的类里面的model数组进行添加
  • XIAODAO:你好,深拷贝的话,个人理解 name属性既然是不可变的,为了实现深拷贝,只需要实现NSCopying协议的copyWithZone方法。

    在copyWithZone方法里写成如下:
    model.name = [self.name mutableCopy];

    有认识不够之处,请不吝赐教
    英俊神武:不需要进行mutableCopy的,两个对象的内存地址都不一样了,这个是自定义对象的拷贝,把自定义对象当做一个整体去思考,里面的属性其实只是简单的赋值操作而已。

本文标题:iOS对自定义对象深拷贝

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