20150624_OC之协议与自定义类型的归档

来源:互联网 发布:从来绝色知难得打一字 编辑:程序博客网 时间:2024/06/05 07:16
协议例子1:////  main.m//  IOS150624_ObjectiveC_协议语句////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>#import "Programmer.h"//****************************//*         协议              *//****************************//协议:约定双方相互遵守的规范//计算机中:http://  ftp://  smb://  tcp//OC中的协议:一组方法的列表//1.定制协议(只做方法的声明,不去实现)//在Foundation中所有的协议直接或者间接的遵守NSObject协议//@protocol Coder <NSObject>////- (void)writeCode;//- (void)debugCode;//- (void)report;////@end//遵守协议,协议名放在<>中,遵守多个协议,协议之间用逗号隔开//@interface Programmer : NSObject <Coder,NSCopying>////@end//3.实现协议(实现协议中的方法),由遵守协议的类实现.协议中的方法默认是必须实现//@implementation Programmer//- (void)writeCode//{//    //}//- (void)debugCode//{//    //}//- (void)report//{//    //}////- (id)copyWithZone:(NSZone *)zone//{//    return self;//}////@end//4.使用协议int main(int argc, const char * argv[]) {    @autoreleasepool {        Programmer *xiaoZhang = [[Programmer alloc]init];        xiaoZhang.name = @"小张";        NSLog(@"%@",xiaoZhang.name);        [xiaoZhang writeCode];        [xiaoZhang debugCode];        [xiaoZhang report];    }        return 0;}//——————————////  Coder.h//  IOS150624_ObjectiveC_协议语句////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>//自定义一个协议,协议名和类名可以相同@protocol Coder <NSObject>- (void)writeCode;- (void)debugCode;- (void)report;@end@interface Coder : NSObject@property (copy,nonatomic)NSString *name;@end//———————————————////  Coder.m//  IOS150624_ObjectiveC_协议语句////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import "Coder.h"@implementation Coder@end//———————————————////  Programmer.h//  IOS150624_ObjectiveC_协议语句////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>#import "Coder.h"   //遵守协议必须包含协议所在的头文件@interface Programmer : Coder <Coder>@end//—————————————————////  Programmer.m//  IOS150624_ObjectiveC_协议语句////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import "Programmer.h"@implementation Programmer- (void)writeCode{    NSLog(@"轻轻松松敲键盘,快快乐乐写代码");}- (void)debugCode{    NSLog(@"辛辛苦苦调代码");}- (void)report{    NSLog(@"工作完成可以报告上线了");}@end协议例子2:////  main.m//  IOS150624_ObjectiveC_协议关键字3////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        Student *std = [[Student alloc] init];        [std wirteCode];        [std debugCode];        [std report];    }    return 0;}//———————————————////  Programmer.h//  IOS150624_ObjectiveC_协议关键字3////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>@protocol Programmer <NSObject>@required   //(缺省),默认,必须实现的方法,不实现会有警告,其他没有影响- (void)wirteCode;- (void)debugCode;- (void)report;@optional   //可选,在遵守该协议的类中可以选择实现或者不实现该方法,不会有警告.但是如果要调用这个方法则必须实现- (void)eat;- (void)drink;@end//———————————————////  Student.h//  IOS150624_ObjectiveC_协议关键字3////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>#import "Programmer.h"//遵守多个协议时,将多个协议写在<>中,使用","分割开@interface Student : NSObject <Programmer>@end//——————————————////  Student.m//  IOS150624_ObjectiveC_协议关键字3////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import "Student.h"@implementation Student- (void)wirteCode{    NSLog(@"写代码");}- (void)debugCode{    NSLog(@"调试代码");}- (void)report{    NSLog(@"写报告");}@end协议例子3:自定义类型的归档////  main.m//  IOS150624_ObjectiveC_协议语句2////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>#import "Dog.h"//*******************//*    使用系统协议   *//*******************int main(int argc, const char * argv[]) {    @autoreleasepool {        //将自定义类型归档,需要遵守NSCoding协议,实现其中的两个方法.(只归档成员变量,不归档类中的方法)        Dog *xiaoBai = [[Dog alloc] init];        xiaoBai.name = @"小白";        xiaoBai.age = 12;        BOOL ret = [NSKeyedArchiver archiveRootObject:xiaoBai toFile:@"/Users/qianfeng/Public/ExerciseProject/IOS150624_ObjectiveC_协议语句2/IOS150624_ObjectiveC_协议语句2/dog.txt"];        if (ret) {            NSLog(@"归档成功");        }        else        {            NSLog(@"归档失败");        }                //反归档        Dog *dog = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/qianfeng/Public/ExerciseProject/IOS150624_ObjectiveC_协议语句2/IOS150624_ObjectiveC_协议语句2/dog.txt"];        if (dog) {            NSLog(@"dog = %@",dog);        }        else        {            NSLog(@"解码失败");        }    }    return 0;}//—————————————////  Dog.h//  IOS150624_ObjectiveC_协议语句2////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import <Foundation/Foundation.h>@interface Dog : NSObject <NSCoding>@property (copy,nonatomic)NSString *name;@property (assign,nonatomic)NSInteger age;@end//———————————————////  Dog.m//  IOS150624_ObjectiveC_协议语句2////  Created by PengJunlong on 15/6/24.//  Copyright (c) 2015年 Peng Junlong. All rights reserved.//#import "Dog.h"@implementation Dog- (void)encodeWithCoder:(NSCoder *)aCoder{    //如果父类也遵守对应的协议,那么应该先调用父类的方法进行编码,层层递归编码    //[super encodeWithCoder:aCoder];    [aCoder encodeObject:self.name forKey:@"name"];    [aCoder encodeInteger:self.age forKey:@"age"];}- (id)initWithCoder:(NSCoder *)aDecoder{    //如果父类也遵守对应的协议,先调用父类的方法解码    //self = [super initWithCoder:aDecoder];    self.name = [aDecoder decodeObjectForKey:@"name"];    self.age  = [aDecoder decodeIntegerForKey:@"age"];    return self;}- (NSString *)description{    return [NSString stringWithFormat:@"name = %@,age = %ld",_name,_age];}@end

0 0
原创粉丝点击