关于NScopying的问题

如果让一个自定义类 能用定义copy属性的实例变量就需对该类接收nscopying协议

//外界如果想要让person对象执行copy方法,必须接收NSCopying协议,实现协议里的方法,来定义copy的细节。

//一个类可以接收多个协议,协议与协议之间用逗号隔开。所有的协议写在父类后面的尖括号内部。

@interface Person : NSObject<SayHello, NSCopying>

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *gender;

@property (nonatomic, retain) NSMutableArray *mArr;

并且在.m文件中红重写copyWithZone方法

//伪拷贝,相当于没有拷贝,只是让外界的对象执行了一次retain操作。

//- (id)copyWithZone:(NSZone *)zone {

//    return [self retain];

//}

//浅拷贝

//拷贝的是地址,对象两个,共用一份内容,改变其中一个对象实例变量的值,另外一个也会访问到改变之后的值。但是一定要注意,字符串如果指向常量区,那么改值相当于重指向,并不会影响另外一个对象的值。

//- (id)copyWithZone:(NSZone *)zone {

//    Person *person = [[Person allocWithZone:zone] init];

//    person.name = self.name;

//    person.gender = self.gender;

//    person.mArr = self.mArr;

//    return person;

//}

//深拷贝,对象两份,内容两份,改变其中一个的值,另外一个不会发生改变。

//拷贝怎么实现,到底是深拷贝还是浅拷贝,取决于内部代码的实现。

- (id)copyWithZone:(NSZone *)zone {

Person *person = [[Person allocWithZone:zone] init];

person.name = [self.name mutableCopy];

person.gender = [self.gender mutableCopy];

person.mArr = [self.mArr mutableCopy];

return person;

}

时间: 2024-11-07 20:44:19

关于NScopying的问题的相关文章

第22条:理解NSCopying协议

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

NSCopying和NSMutableCopying协议

NSCopying NSCopying是一个与对象拷贝有关的协议.如果想让一个类的对象支持拷贝,就需要让该类实现NSCopying协议.NSCopying协议中的声明的方法只有一个- (id)copyWithZone:(NSZone *)zone.当我们的类实现了NSCopying协议,通过类的对象调用copy方法时,copy方法就会去调用我们实现的- (id)copyWithZone:(NSZone *)zone方法,实现拷贝功能.实现代码如下所示: - (id)copyWithZone:(N

NSCopying简析

用到NSCopying的时候并不多,但还是有必要知道最基本的用途,比方说数组的拷贝操作,需要注意的是,数组的拷贝操作并不是执行了 copy 方法,而是需要执行 initWithArray:copyItems: ,这点需要注意. 源码: // // Model.h // NSCopy // // Created by YouXianMing on 15/5/2. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import

Objective-c之NSCopying

Objective-c之NSCopying copy的原理: 执行<NSCopying>协议,类中必须实现copyWithZone:方法响应的copy消息. copy消息将发送copyWithZone:这个消息给你的类,它的参数是nil. copyWithZone:返回一个不可改变的copy *MyPoint.h*/ #import <Foundation/Foundation.h> @interface MyPoint : NSObject<NSCopying>//继

OC中没有实现NSCopying技术时的深复制技术

最近看书看到一种新的实现深复制对象的技术,使用Foundation的归档技术,下面是代码: ? 1 2 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray]; NSMutableArray *dataArray2 = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 上述即实现了将dataArray深复制给dataArray2,另外一种简便写法是: ? 1 da

自定义类与NSCopying协议

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

自定义类实现&lt;NSCopying&gt;协议

目的:自定义一个 Person 类,实现 copy. 首先定义一个 Person 类,由于是自定义类,为了能够支持 copy 方法,需要实现<NSCopying>协议 @interface Person : NSObject<NSCopying> @property (nonatomic, retain)NSString * name; @property (nonatomic, retain)NSString * sex; - (void)setName:(NSString *)

以最少的代码让自定的model实现NSCoding、NSCopying协议

项目中用到了自定义的model:Person(栗子).此model需要可以实现归档的功能,但是属性非常多,且类似的model很多.如果按照常规去写归档的代码,那么无论是写起来还是维护起来都非常困难. 由于model继承自NSObject,所以给NSObject添加了扩展用来实现自定义model的归档功能.实现思路来源于伟大的网络和MJExtention,所以应该不算是原创吧,反正这个实现也快烂大街了. 大致为: 1:获取当前类及父类的class及属性名称和类型 2:实现归档常规方法 3:宏定义常

iOS -- SKSpriteNode类

SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKSpriteNode.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术