Objective-C(10)抽象父类---协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = [[[self class] allocWithZone:zone] init];
    p.age = self.age;
    p.name = [self.name copy];
    return p;
}


对象若想要调用mutableCopy方法必须遵循NSMutableCopying协议,并实现方法:

- (id)mutableCopyWithZone:(NSZone *)zone


  • NSCoding协议

NSKeyedArchiver归档器

+ (BOOL)archiveRootObject:(id)rootObject toFile:(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开头的方法。


本文出自 “teacherAn” 博客,请务必保留此出处http://annmeng.blog.51cto.com/3321237/1745627

以上是关于Objective-C(10)抽象父类---协议的主要内容,如果未能解决你的问题,请参考以下文章

Swift 类的 Objective-c 协议。无法识别的方法

iOS -- Effective Objective-C 阅读笔记

Thrift源码分析-- 协议和编解码

Objective-C之协议

细数Objective-C中的回调机制

协变和逆变