NSCopying protocol 实现对象复制功能,在对象接收到copy消息后copyWithZone会被调用,在此方法中应创建一个新的同类型对象,并且设备其所有属性后返回,创建该新对象时需要使用allocWithZone方法,该方法可以通过一个已经指定分配好的内存创建新的对象,即当以下方法被调用时内存已分配完毕,将通过NSZone对象封装传递过来。
同样的有NSMutableCopying来处理mutabliecopy消息
如果诸如NSArray NSDictionary 的initWithDictionary:copyItems:方法时,元素对象也必需实现NSCopying
NSCoding protocol 实现对象序列化功能,对象与二进制之间的转换,当收到转换消息时archiver会以super class形势NSCoder传递到对象内部,在以下方法中将对象的逐个属性编码进NSCoder中或解码到当前对象,并根据相应的键值做索引。
被编码后的对象可以以NSData的形势呈现,即可以使用writeToFile或dataWithContentsOfFile写入或从本地文件读出。
同样的有NSMutableCopying来处理mutabliecopy消息
如果诸如NSArray NSDictionary 的initWithDictionary:copyItems:方法时,元素对象也必需实现NSCopying
- (id)copyWithZone:(NSZone *)zone
{
MyData* obj = [[[self class] allocWithZone:zone] init];
obj.name = [self copy];
obj.age = self.age;
return obj;
}
NSCoding protocol 实现对象序列化功能,对象与二进制之间的转换,当收到转换消息时archiver会以super class形势NSCoder传递到对象内部,在以下方法中将对象的逐个属性编码进NSCoder中或解码到当前对象,并根据相应的键值做索引。
被编码后的对象可以以NSData的形势呈现,即可以使用writeToFile或dataWithContentsOfFile写入或从本地文件读出。
对一个NSArray或NSDictionary对象执行writeToFile方法时,需要保证所有元素为基本数据类型(NSString,NSData),否则需要将元素对象实现NSCoding并且需要将集合对象编译为NSData。
当对象被NSKeyedUnArchiver时调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
return self;
}
当对象被NSKeyedArchiver时调用
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}