赋值与复制

说一个基础问题

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;

即可。

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

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,388评论 18 399
  • 00、前言Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区...
    夜幕小草阅读 6,433评论 0 12
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,405评论 2 17
  • 1 场景问题# 1.1 订单处理系统## 考虑这样一个实际应用:订单处理系统。 现在有一个订单处理的系统,里面有个...
    七寸知架构阅读 10,010评论 3 63
  • 分开的第三个月,删掉了微信好友,卸载了人人,就这样,我彻底放弃你了,但不得不承认,在我高三记忆中,占据自己内心最多...
    冯二菲阅读 1,580评论 5 1

友情链接更多精彩内容