美文网首页
赋值与复制

赋值与复制

作者: anjohnlv | 来源:发表于2017-03-28 13:52 被阅读13次

说一个基础问题

Person *p1 = [Person new];
p1.age = 1;
Person *p2;
Person *p3;
p2 = p1;
p2.age = 2;
p3 = p1;
p3.age = 3;

问:p1、p2、p3的age分别是多少?
答:p1.age==p2.age==p3.age==3;

原因就不解释了,不明白的请自己使劲想。
如果我们想要p1.age==1,p2.age==2,p3.age==3,应该怎么做呢?

方法1:

分别实例化不同的对象

Person *p1 = [Person new];
p1.age = 1;
Person *p2 = [Person new];
p2.age = 2;
Person *p3 = [Person new];
p3.age = 3;

实现需求。但如果我们的p1,还有name,birthday,gender,hobby,address等等很多属性,而我们只需要针对他的age进行修改,按照以上的方法,我们不得不分别对每个实例化对象进行若干次重复的赋值操作。

方法2:

将p1复制给p2,p3等

Person *p1 = [Person new];
Person *p2;
Person *p3;
p1.age = 1;
p2 = [p1 copy];
p2. age = 2;
p3 = [p1 copy];
p3.age = 3;

需要注意的是,虽然Cocoa Touch框架提供了相关的方法,但是想要实现复制,还是需要NSObject的子类实现NSCopying协议及其方法:

-(instancetype)copyWithZone:(NSZone *)zone

当我们调用copy时,实际上就是调用的默认的

[self copyWithZone:nil];

在本例中,我们需要实现

@interface Person : NSObject<NSCopying>

@property(nonatomic, strong)NSString *name;
@property(nonatomic)int age;
//若干其他属性
@end

@implementation Person

-(instancetype)copyWithZone:(NSZone *)zone {
    Person *copy = [[[self class] allocWithZone:zone]init];
    copy.name = self.name;
    copy.age = self.age;
    //以及其他若干的属性复制,如果没有赋值,则复制的person将会丢失这些属性
    return copy;
}

@end

不得不说,其实还是挺麻烦。

方法3:(后补)

真的觉得挺麻烦,于是自己尝试封装了一个工具类。
地址:http://www.jianshu.com/p/3355936f37a3
如此一来,想实现题干需求,只需要

Person *p1 = [Person new];
p1.age = 1;
Person *p2 = [p1 autoCopy];
Person *p3 = [p1 autoCopy];
p2.age = 2;
p3.age = 3;

即可。

相关文章

  • 赋值与复制

    说一个基础问题 问:p1、p2、p3的age分别是多少?答:p1.age==p2.age==p3.age==3; ...

  • C++中 对象的赋值与复制

    赋值与拷贝 1、可以从调用形式上,对“对象的赋值”和“对象的复制”进行区分: 对象的赋值:指的是调用了类的赋值运算...

  • 设计模式 - 原型模式

    注意深复制与浅赋值的问题 C#中如果需要实现深复制,必须实现 ICloneable 接口。

  • js中的深复制与浅复制

    基本类型赋值 基本类型赋值是将是将值复制给这个变量,变量之间的赋值,是将变量的值给复制给其他变量。都是将值复制存到...

  • 面向对象第二天

    值类型与引用类型 值类型:赋值是复制数据内容。 引用类型:赋值的是存储地址。 原型: 函数原型里包含prototy...

  • Swift(七)基本运算

    赋值运算 复制运算中需要注意一点就是, 与 C 和 Objective - C 的赋值运算符不同,Swift 的赋...

  • 第三章 控制程序流程 2018-10-09

    1.赋值 主数据类型的赋值A=B,复制后A和B仍旧独立 对象之间的赋值A=B,复制后,A和B同指向B最初所指向的对...

  • JavaScript 深拷贝、浅拷贝和 Object.assig

    数组解构赋值的模式同样适用于任意迭代器:ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解 浅拷贝 浅拷贝是指复制...

  • C++语法系列之4

    1 复制构造函数的问题 如果没有显示的编写复制构造函数或者赋值运算符,编译器会自动生成默认的复制构造函数和赋值运算...

  • Numpy学习笔记(三)

    【转载】Numpy教程 复制与视图 完全不拷贝简单的赋值不拷贝数组对象或它们的数据 视图(view)和浅复制不同的...

网友评论

      本文标题:赋值与复制

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