-协议和归档



一、协议
【认识协议】
    1、从生活角度
            就业协议、贷款协议、租赁协议、保密协议、……
            协议就是约束遵从协议的人的行为
    2、从编程角度
            程序中的协议是约束遵从协议的对象的行为
            规定遵从协议的对象的接口(方法)

【协议语法】
    声明协议
    @protocol WriteCodeProtocol <NSObject>
  - (void)writeCodeUseOC;
  @end
    遵从协议
    @interface JYMonkey : NSObject<WriteCodeProtocol>
    遵从多个协议
        <协议1,协议2>

    1、一个类遵从了协议,需要实现协议中规定的方法;
            一个类遵从了协议,该类的对象也就遵从了协议。
    2、遵从协议的id指针,只能指向遵从协议的对象
    3、遵从协议的id指针,只能调用协议中规定的方法    
    4、协议中的方法有两类
            @required(必需实现的)
            @optional(选择实现的)

【协议作用】
    1、统一接口(类似于继承)
    2、模拟实现多继承
    3、实现委托代理(明天讲)

二、归档(archive)
【认识归档】
    1、归档就是将对象按照特定的顺序写入到文件中,
            以便以后再次从文件中读取对象。
    2、解档就是从已经归档的文件中读成对象的过程
    3、进行归档的对象所属的类必需遵从NSCoding协议,
            必需实现协议中规定的方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
    4、进行归档的对象的子对象也要遵从NSCoding,
            也要实现协议中规定的方法,否则归档会失败

【归档使用】
  1、系统类的归档,见【系统类的归档】
BOOL ret = [NSKeyedArchiver archiveRootObject:dic toFile:PATH];
id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:PATH];
  2、自定义类归档,见【自定义类归档】
- (void)encodeWithCoder:(NSCoder *)aCode
{
    [aCode encodeObject:_className forKey:@"className"];
    [aCode encodeObject:_student forKey:@"student"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        _className = [aDecoder decodeObjectForKey:@"className"];
        _student = [aDecoder decodeObjectForKey:@"student"];
    }
    return self;
}

JYClass:<NSCoding>
className(NSString)
student(JYStudent)

JYStudent:<NSCoding>
name
age
grade
number
        JYClass
         /          
        /              
className      student(JYStudent)
(NSString)          /          |            
                 /         |              
            name  age grade number
练习:
1、完善自定义类归档的例子,要求班级类中可以存储多个学生
2、完成动物园类的归档,要求:
    动物园类:
            成员变量:园名、存放动物的数组
            成员方法:添加动物、按身高排序、展示所有动物
    动物类:老虎、狮子、大象、猴子、长颈鹿
            成员变量:名字、年龄、身高、体重
            成员方法:根据需要添加


原文地址:https://www.cnblogs.com/rainwz/p/4589093.html