NSCopying、NSCoding

NSCopying:


如果要调用一个对象的copy方法,这个对象必须遵循NSCopying的协议。这个协议中规定了一个方法:-
(
id)copyWithZone:(NSZone *)zone;我们就是通过实现这个方法给对象提供拷贝的功能。对于很多现有类,如NSStringNSDictionary,。。。这个方法已经实现。假设我们现在自定义了一个类,需要为这个类提供拷贝的功能,就需要自己来动手写CopyWithZone的方法。

1、实现NSCopying:不继承copyWithZone:的类,使用allocinit...

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;
}



NSCoding:
对象存储的条件是: 对象需要遵守 NSCoding 协议
对象需要实现:
存储的时候需要 调用 encodeWithCoder 方法
读取的时候需要调用initWithCoder 方法
访问对象:
[NSKeyedArchiver archiveRootObject:stu toFile:path]; 存储 

[NSKeyedUnarchiver unarchiveObjectWithFile:path]; 读取


对象代码

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface MJStudent : NSObject  <NSCoding>  
  4. @property (nonatomiccopyNSString *no;  
  5. @property (nonatomic, assign) double height;  
  6. @property (nonatomic, assign) int age;  
  7. @end  
  1. - (void)encodeWithCoder:(NSCoder *)encoder  
  2. {  
  3.     [encoder encodeObject:self.no forKey:@"no"];  
  4.     [encoder encodeInt:self.age forKey:@"age"];  
  5.     [encoder encodeDouble:self.height forKey:@"height"];  
  6. }  

  1. - (id)initWithCoder:(NSCoder *)decoder  
  2. {  
  3.     if (self = [super init]) {  
  4.         // 读取文件的内容  
  5.         self.no = [decoder decodeObjectForKey:@"no"];  
  6.         self.age = [decoder decodeIntForKey:@"age"];  
  7.         self.height = [decoder decodeDoubleForKey:@"height"];  
  8.     }  
  9.     return self;  
  10. }  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值