NSCopying:
如果要调用一个对象的copy方法,这个对象必须遵循NSCopying的协议。这个协议中规定了一个方法:-
(id)copyWithZone:(NSZone *)zone;我们就是通过实现这个方法给对象提供拷贝的功能。对于很多现有类,如NSString,NSDictionary,。。。这个方法已经实现。假设我们现在自定义了一个类,需要为这个类提供拷贝的功能,就需要自己来动手写CopyWithZone的方法。
1、实现NSCopying:不继承copyWithZone:的类,使用alloc和init...。
2、实现NSCopying:继承copyWithZone:的类,调用父类的copyWithZone:。如果超类的实现使用NSCopyObject功能,必须对retain对象的指针实例变量作出明确的指派。
3、实现NSCopying:通过retain原有的,而不是创建一个新的副本,如果类和它的内容是不可改变的。
如果子类从它的超类继承NSCopying,并声明了额外的实例变量,子类在重写copyWithZone:妥善处理自己的实例变量之前需先调用父类的实现。
如果想要区分可变副本和不可变副本,那么copyWithZone:应该返回不可变副本,而mutableCopyWithZone:应该返回可变副本。产生对象的可变副本并不要求被复制的对象本身也是可变的(反之亦然)。
类的设计者必须确定是否在NSCopying中实现浅复制或深复制,并为其编写文档,以告知类的使用者。
1
2
3
4
5
6
7
8
9
|
- (id)copyWithZone:(NSZone *)zone {
id copy = [[[self
class
] alloc] init];
if
(copy) {
[copy setId:[self.id copyWithZone:zone]];
[copy setNickName:[self.nickName copyWithZone:zone]];
}
return
copy;
}
|
对象需要实现:
读取的时候需要调用initWithCoder 方法
[NSKeyedArchiver archiveRootObject:stu toFile:path]; 存储
[NSKeyedUnarchiver unarchiveObjectWithFile:path]; 读取
对象代码
- #import <Foundation/Foundation.h>
- @interface MJStudent : NSObject <NSCoding>
- @property (nonatomic, copy) NSString *no;
- @property (nonatomic, assign) double height;
- @property (nonatomic, assign) int age;
- @end
- - (void)encodeWithCoder:(NSCoder *)encoder
- {
- [encoder encodeObject:self.no forKey:@"no"];
- [encoder encodeInt:self.age forKey:@"age"];
- [encoder encodeDouble:self.height forKey:@"height"];
- }
-
- - (id)initWithCoder:(NSCoder *)decoder
- {
- if (self = [super init]) {
- // 读取文件的内容
- self.no = [decoder decodeObjectForKey:@"no"];
- self.age = [decoder decodeIntForKey:@"age"];
- self.height = [decoder decodeDoubleForKey:@"height"];
- }
- return self;
- }