协议例子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