自定义类实现<NSCopying>协议

目的:自定义一个 Person 类,实现 copy.

首先定义一个 Person 类,由于是自定义类,为了能够支持 copy 方法,需要实现<NSCopying>协议

@interface Person : NSObject<NSCopying>
@property (nonatomic, retain)NSString * name;
@property (nonatomic, retain)NSString * sex;

- (void)setName:(NSString *)name
            sex:(NSString *)sex;
@end

<NSCopying>协议中有一个 - (id)copyWithZone:(NSZone *)zone方法,需要在 Person 的. m 文件中实现它.

@implementation Person

- (id)copyWithZone:(NSZone *)zone
{
    id p = [[[self class] allocWithZone:zone] init];<span style="white-space:pre">    //考虑到 Person 可能会有子类,这里用 id 表示类型
    [p setName:_name sex:_sex];                //设置复制对象的实例变量,否则默认拷贝的对象的实例变量值为空
    return p;
}
- (void)setName:(NSString *)name
            sex:(NSString *)sex
{
    _name = name;
    _sex = sex;
}
@end

在main.m 文件中进行测试

Person * p1 = [[Person alloc] init];                                 //创建 p1 对象
        [p1 setName:@"张三" sex:@"男"];                              //为 p1 实例变量赋值
        Person * p2 = [p1 copy];                                    //从 p1 拷贝一个新对象 p2
        NSLog(@"p2.name = %@, p2.sex = %@", p2.name, p2.sex);       //打印 p2 的 name 和 sex
        p2.name = @"李四";                                          //更改 p2 的 name
        NSLog(@"p2.name = %@", p2.name);
        NSLog(@"p1.name = %@", p1.name);                            //再次打印 p1 的 name,验证 p1 的 name 是否改变

下面是打印结果:

2015-01-21 21:27:59.466 CopyTest[2053:303] p2.name = 张三, p2.sex = 男
2015-01-21 21:27:59.468 CopyTest[2053:303] p2.name = 李四
2015-01-21 21:27:59.468 CopyTest[2053:303] p1.name = 张三

可以看出,改变 p2 的 name, 并没有影响 p1 的name.

时间: 2024-08-29 00:50:35

自定义类实现<NSCopying>协议的相关文章

自定义类与NSCopying协议

代码: @import Foundation; /**************************************** * Person类 ****************************************/ // 要采用某个协议,需要在类的声明中列出该协议的名称,并用尖括号括起来 // 同时采用多个协议,则在协议的名称之间用逗号分割,如:<NSCopying, NSMutableCopying> // 可以按任意顺序列出多个协议 @interface Person

IOS- NSCoding协议,NSKeyedArchiver自定义类归档使用详解

使用NSCoding协议可以实现归档自定义的类,NSKeyedArchiver可以归档我们自定义的类;要实现自定义类的归档,需要实现 encodeWithCoder(编码)和initWithCoder(解码) 我创建一个自定义的Student类,遵循NSCoding协议,实现这两个方法: // // Student.h // UserList // // Created by http://blog.csdn.net/yangbingbinga on 14/11/14. // Copyright

第22条:理解NSCopying协议

如果想自定义类支持拷贝操作,那就要实现NSCopying协议(而不是复写copy方法)或 NSMutableCopying的协议. 不可变版本的拷贝: NSCopying协议,该协议只有一个方法: -(id)copyWithZone:(NSZone*)zone; // 以前开发程序时,会据此把内存分成不同的“区”(zone),而对象会创建在某个区里面.现在不用了,每个程序只有一个区:“默认区”(default zone). 例: -(id)copyWithZone:(NSZone*)zone {

自定义类工厂方法

1.自定义工厂方法 什么是工厂方法(快速创建方法) 类工厂方法是一种用于分配.初始化实例并返回一个它自己的实例的类方法.类工厂方法很方便,因为它们允许您只使用一个步骤(而不是两个步骤)就能创建对象. 例如new 自定义类工厂方法的规范 (1)一定是+号开头 (2)返回值一般是instancetype类型 (3)方法名称以类名开头,首字母小写 示例 + (id)person; + (id)person { return [[Person alloc]init]; } + (id)personWit

【Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之四】使用绑定C++至Lua的自定义类

续[Quick-COCOS2D-X 3.3 如何绑定自定义类至Lua之三]动手绑定自定义类至Lua 之后,我们已经完成了自定义类至Lua的绑定.在接下来的环节,我们将使用它. 首先,我们需要确定,通过Python脚本我们生成了哪些绑定文件?我们罗列一个表单. // Path : F:\Cocos2dx-Lua\Garfield\frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 1. lua_pet_auto.hpp // Path : 

分类 类扩展 继承 协议 委托

分类 类扩展 继承 协议 委托 分类(Category) 不产生新类,不修改原类,但有自己的.h和.m文件 分类只能向原类中增加方法,或者重写原类的方法 声明的@property只会生成getter setter方法的声明 类.h中定义的方法必须实现,但分类.h中定义的方法,可以不实现 同名方法,分类的优先级高类别主要有3个作用:(1)将类的实现分散到多个不同文件或多个不同框架中.(2)创建对私有方法的前向引用.(类.h中未声明,但存在于.m中的私有方法,通过在分类.h中声明一下,就可以在其他类

C#中自定义类数组和结构数组的使用

如有雷同,不胜荣幸,若转载,请注明 最近在很多项目中发现很多时候给定的数组要实现某个逻辑或处理很是麻烦,一维数组,二维数组,,,等等需要经过n多转换,还不如自己写一个自定义数组,既方便又节省时间,以下是类数组,其实相当于定义了一个实体类一样,只是使用的时候写成数组的形式在用 Class RGB { public byte red; public byte green; public byte blue; public RGB(byte r,byte g,byte b) { this.red =

PyQt5在QWidget窗体中显示Qwidget的自定义类

[概览] 1.显示原生Qwidget 1)不使用布局(绝对定位) 2)使用布局 2.显示Qwidget的自定义类 1)不使用布局(绝对定位)       2)使用布局 [知识点] 1.显示原生Qwidget 1)不使用布局(绝对定位) 这种情况下,原生QWidget部件在实例化时必须带parent参数,当然parent = self,即:  self.widget = QWidget(self) 1 class MyWindow(QWidget): 2 def __init__(self, pa

js自定义类与对象

js中创建自定义类与创建对象:js创建类与AS3,java都有很大的不同,,,下面来看看他的庐山真面目..由于js也是一个面向对象的编程语言所以也存在像其他语言那样的创建自定义的类,和通过类来创建对象.js的类是有一下三部门组成1.构造函数2.属性3.方法自定义一个类: function MyClass(id,age,name) { this.id = id; this.age = age; this.name = name; } 从这个类的定义形式可以看出,js定义类的形式和其他语言有很大的不