//
// 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. Java入门第37课——猜字母游戏之设计数据结构

    问题        有猜字母游戏,其游戏规则为:程序随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串.玩家可以猜测多次,每猜测一次,则由系统提示结果.如果猜测的完全正确,则游戏结 ...

  2. 服务器主机&软件性能测试自定标准

    PS:最近一直致力于代理ip的服务搭建,其中就要根据客户群体的不同来测试搭建环境和搭建软件的性能,但是不同的客户群体所处的环境和使用的软件是不同的,而业内又没有一套完整的评估方法.在忽略网络本身来讲, ...

  3. 事件的节流(throttle)与防抖(debounce)

    事件的节流(throttle)与防抖(debounce) 有些浏览器事件可以在短时间内快速触发多次,比如调整窗口大小或向下滚动页面.例如,监听页面窗口滚动事件,并且用户持续快速地向下滚动页面,那么滚动 ...

  4. c++通过CMake实现debug开关

    刚学cmake,很多东西还不是很懂,不过今天刚刚实现了通过CMake控制debug的开关,兴奋之余记录一下. 背景介绍: 最近参与到了一个大的C++项目,很多代码已经非常成熟,我来添加一些辅助功能,但 ...

  5. maven入门链接

    http://www.cnblogs.com/now-fighting/p/4857625.html

  6. CentOS 6磁盘配额

    可以指定用户能超过其配额限制.如果不想拒绝用户对卷的访问但想跟踪每个用户的磁盘空间使用情况,启用配额而且不限制磁盘空间的使用是非常有用的.也可指定不管用户超过配额警告级别还是超过配额限制时是否要记录事 ...

  7. C语言结构体用法

    结构体的定义: 方法一: struct student { char name[10]; int age; int number; }; struct student stu1; 方法二: struc ...

  8. python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!

    是时候给你说说 爬虫框架了 使用框架来爬取数据 会节省我们更多时间 很快就能抓取到我们想要抓取的内容 框架集合了许多操作 比如请求,数据解析,存储等等 都可以由框架完成 有些小伙伴就要问了 你他妈的 ...

  9. 【Codeforces 159B】Matchmaker

    [链接] 我是链接,点我呀:) [题意] 笔和笔盖 笔有颜色和直径 笔盖也有颜色和直径 笔盖和笔如果直径相等 那么称为good 如果笔盖和笔直径相等.颜色也相等,那么称为very good 问你怎样安 ...

  10. Ajax学习总结(2)——Ajax参数详解及使用场景介绍

    一.定义和用法 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJA ...