//
// main.m
// 自定义类实现copy #import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h" int main(int argc, const char * argv[]) {
/*
1.以后想让自定义的对象能够被copy只需要遵守NSCopying协议
2.实现协议中的- (id)copyWithZone:(NSZone *)zone
3.在- (id)copyWithZone:(NSZone *)zone方法中创建一个副本对象, 然后将当前对象的值赋值给副本对象即可
*/
Person *p = [[Person alloc] init];
p.age = ;
p.name = @"lnj";
NSLog(@"%@", p);
Person *p22 = [p copy];//p没有copy方法,
Person *p2 = [p mutableCopy];
NSLog(@"%@", p2);//name= lnj, age = 30
NSLog(@"%@", p22);//name = lnj, age = 30
p.age = ;
p.name = @"ssss";
NSLog(@"%@", p2);//name= lnj, age = 30
NSLog(@"%@", p22);//name = lnj, age = 30 Student *stu = [[Student alloc] init];
stu.age = ;
stu.height = 1.75;
stu.name = @"lnj";
NSLog(@"stu = %@", stu);
// 如果想让子类在copy的时候保留子类的属性, 那么必须重写copyWithZone方法, 在该方法中先调用父类创建副本设置值, 然后再设置子类特有的值
Student *stu2 = [stu copy];
NSLog(@"stu2 = %@", stu2); return ;
}
//
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject<NSCopying, NSMutableCopying> //才有copy方法, @property (nonatomic, assign) int age; @property (nonatomic, copy) NSString *name;
@end
//
// Person.m #import "Person.h" @implementation Person - (id)copyWithZone:(NSZone *)zone //拷贝一个副本
{
// 1.创建一个新的对象
Person *p = [[[self class] allocWithZone:zone] init]; //class方法,获取这个对象对应的类。
// 2.设置当前对象的内容给新的对象,拷贝的对象和原来对象的内容要一样,
p.age = _age;
p.name = _name;
// 3.返回新的对象
return p;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
// 1.创建一个新的对象
Person *p = [[[self class] allocWithZone:zone] init];
// 2.设置当前对象的内容给新的对象
p.age = _age;
p.name = _name;
// 3.返回新的对象
return p;
} - (NSString *)description
{
return [NSString stringWithFormat:@"name = %@, age = %i", _name, _age];
}
@end
//
// Student.h
// #import "Person.h" @interface Student : Person //子类继承父类,会继承父类的协议。 @property (nonatomic, assign) double height;
@end
//
// Student.m #import "Student.h" @implementation Student - (id)copyWithZone:(NSZone *)zone
{
// 1.创建副本
// id obj = [[self class] allocWithZone:zone];
id obj = [super copyWithZone:zone];
// 2.设置数据给副本
// [obj setAge:[self age]];
// [obj setName:[self name]];
[obj setHeight:_height]; // 3.返回副本
return obj;
} - (NSString *)description
{
return [NSString stringWithFormat:@"name = %@, age = %i, height = %f", [self name], [self age], _height];
} @end

oc83--自定义类实现copy方法的更多相关文章

  1. WebService中使用自定义类的解决方法(5种)

    转自:http://www.cnblogs.com/lxinxuan/archive/2007/05/24/758317.html Demo下载:http://files.cnblogs.com/lx ...

  2. 第8.16节 Python重写自定义类的__str__方法

    一. 引言 上节结合案例介绍了重写__repr__方法的关注点,重写__repr__方法的要点是要准确的输出开发人员关注的信息,并便于开发人员使用相关信息.而__str__方法是为最终用户返回类的相关 ...

  3. 第8.15节 Python重写自定义类的__repr__方法

    一. 引言 前面两节分别介绍了Python类中的__str__和__repr__方法的作用和语法,所有新式类都支持这两个方法,因为object类实现了这两个方法,但实际上各位开发者在自定义类的过程中, ...

  4. VS2015自定义类模板的方法

    在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...

  5. IDEA自定义类注释和方法注释(自定义groovyScript方法实现多行参数注释)

    一.类注释 1.打开设置面板:file -> setting -> Editor -> file and code Templates 选择其中的inclues选项卡,并选择File ...

  6. Intellij IDEA自定义类模板和方法模板

    以Intellij IDEA 2017.3.5为例 定义类模板 依次打开File->Settings->File and Code Templates->Files, 选择class ...

  7. Qt自定义类重写 copy

    PtsData PtsData::copy(const PtsData &ptsData) { PtsData ptsData1; ptsData1.data_b = ptsData.data ...

  8. 自定义的类实现copy操作

    1.自定义类实现copy操作 让类遵守NSCopying协议 实现 copyWithZone:方法,在该方法中返回一个对象的副本即可. 在copyWithZone方法中,创建一个新的对象,并设置该对象 ...

  9. MFC中 自定义类访问主对话框控件的方法

    之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...

随机推荐

  1. Microsoft Access Engine

    在64位Win7操作系统中安装Microsoft Access Engine的解决方案 原创 2014年01月06日 19:33:56 44847 现在的Win7系统中安装的一般都是32位的Offic ...

  2. C++写注册表

    1.       注册表简介 注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息.16位驱动在Winnt (Win ...

  3. 梦想Android版CAD控件2018.7.26更新

    下载地址: http://www.mxdraw.com/ndetail_109.html 1. 增加所有接口CHM帮助文档 2. 增加得到当前打开文件函数 3. 读写CAD扩展记录接口 4. 读写属性 ...

  4. vue基础---事件处理

    (1)事件监听 v-on 指令监听 DOM 事件,并在触发时运行JS代码 <div class="event_area"> {{message}} <button ...

  5. tp系统常量

    ThinkPHP的公共入口文件里定义了系统常量 RUNTIME_PATH----系统运行时目录 LIB_PATH-----------系统核心类库目录 CORE_PATH--------Think类库 ...

  6. 如何使用fio模拟线上环境

    线上表现 这里我想通过fio来模拟线上的IO场景,那么如何模拟呢? 首先使用iostat看线上某个盘的 使用情况,这里我们需要关注的是 avgrq-sz, avgrq-qz. #iostat -dx ...

  7. java.lang.NoSuchFieldError: DEFAULT_INCOMPATIBLE_IMPROVEMENTS

    解决方案: 启动类上加@EnableAutoConfiguration(exclude = { FreeMarkerAutoConfiguration.class }) 或者在配置文件添加spring ...

  8. Vue.js 计算属性(computed)

    Vue.js 计算属性(computed) 如果在模板中使用一些复杂的表达式,会让模板显得过于繁重,且后期难以维护.对此,vue.js 提供了计算属性(computed),你可以把这些复杂的表达式写到 ...

  9. 数据结构---链表ADT C++实现

    最近在学习数据结构,刚开始一直在看书,但是总是感觉似懂非懂,心想还不如自己操练一波,势必有所收获.现将实现代码发表此地,以备日后复习,若有错误或者建议,欢迎告知本人! 1. 节点类 class Nod ...

  10. Linux无人值守安装系统

    yum install dhcp -yvim /etc/dhcp/dhcpd.conf--------------------------------------------- allow booti ...