//
// 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

最新文章

  1. Html和CSS布局技巧
  2. Struts2 入门
  3. Windows操作系统待整理
  4. BZOJ1088扫雷Mine 解析报告
  5. mac 下真机调试 android 手机
  6. 导入module
  7. Teradata中fastload使用
  8. 图形化OpenGL调试器 BuGLe [转]
  9. Android支付接入(一):支付宝
  10. Windows CE,你妈吗喊你在多核上玩玩
  11. Flip Game
  12. OC-多线程GCD的使用细节
  13. git fetch
  14. bookStore第二篇【图书模块、前台页面】
  15. CentOS系统下搭建tomcat服务器
  16. phpcms中set_config和get_sysinfo函数
  17. 小甲鱼Python第九讲课后习题--010列表
  18. linux 下程序员专用搜索源码用来替代grep的软件ack(后来发现一个更快的: ag), 且有vim插件的
  19. SQL GROUP BY对多个字段进行分组
  20. 【Go命令教程】4. go get

热门文章

  1. Windows开源Web服务器性能和压力测试工具
  2. CAD向控件注册一个命令
  3. 怎么让Eclipse对html和js代码自动提示
  4. reversed()函数和sorted()函数
  5. STL源码分析之第二级配置器
  6. Jqueryd的一些 总结
  7. Python字符串(Python学习笔记02)
  8. 洛谷 2434 [SDOI2005]区间
  9. FJoi2017 1月20日模拟赛 恐狼后卫(口糊动规)
  10. HDU 3308 (线段树区间合并)