Objective-C(10)抽象父类---协议
协议的定义与使用
什么是协议?
可以用来声明一大堆方法(不能声明成员变量)
只要某个类遵循了这个协议,就相当于拥有了这个协议中的所有方法声明
只要父类遵守了某个协议,就相当于子类也遵守了
添加协议头文件:Objective-C File —> protocol
协议类似于Java中的接口,类似于C++中的抽象类
定义协议:
@protocol协议名<父协议名1,父协议名2,...>…//方法声明列表@end
协议中的方法的限定:
@required 其后的方法要求在具体的类中必须实现
@optional 其后的方法要求在具体的类中选择实现
遵循协议:
@interface类名:父类<协议名1,协议名2,...>…//@end
协议也可以遵守协议,相当于对现有协议的扩充
基协议NSObject:
该协议中声明了如内存管理等基本方法,自定义协议一定要遵循这个基协议
类的对象属性(复合的)需要指明该属性遵循哪些协议:
@property(nonatomic,strong)类名<协议名>*属性名;@property(nonatomic,strong)id<协议名>属性名;
也就是说,类名<协议名> 才表示一个确定的类型
协议可定义在单独的.h文件中,也可以定在某个类的文件中
NSCopying协议
创建对象副本 ,使用copy或mutablecopy方法创建一个对象的副本
-(id)copy-(id)mutableCopy
浅复制
指针的拷贝,源对象和副本对象指向同一个对象
对象的引用计数+1,相当于做了一次retain。(内存管理)
深复制
内容的拷贝,源对象和副本对象指向不同的对象
源对象的引用计数不变,副本的引用计数为1
对象若想要调用copy方法必须遵循NSCopying协议,并实现方法:
-(id)copyWithZone:(NSZone*)zone
如:
-(id)copyWithZone:(NSZone*)zone{AMPerson*p=[[[selfclass]allocWithZone:zone]init];p.age=self.age;p.name=[self.namecopy];returnp;}
对象若想要调用mutableCopy方法必须遵循NSMutableCopying协议,并实现方法:
-(id)mutableCopyWithZone:(NSZone*)zone
NSCoding协议
NSKeyedArchiver归档器
+(BOOL)archiveRootObject:(id)rootObjecttoFile:(NSString*)path+(NSData*)archivedDataWithRootObject:(id)rootObject
NSKeyedUnarchiver解档器
+(id)unarchiveObjectWithData:(NSData*)data+(id)unarchiveObjectWithFile:(NSString*)path
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档。
如果是自定义的模型对象,模型对象需要遵循NSCoding协议,并实现方法:
-(void)encodeWithCoder:(NSCoder*)encoder-(instancetype)initWithCoder:(NSCoder*)decoder
NSCoder编码器
encodeWithCoder:方法中应对打算归档的属性进行编码,使用encode开头的方法。
initWithCoder:方法中应对归档中所有的数据进行解码(到属性),使用decode开头的方法。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。