——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
非正式协议:
非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方法的重写。
protocol:
接口就是一堆方法的声明没有实现,而在OC里面,Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中,接口是由一个叫做协议的protocol来实现的。
协议的使用流程:
定义协议----> 在类中采用指定的协议---->实现协议中的方法(注意方法有必须实现和选择实现两种)
协议的定义:
<span style="font-size:24px;">@protocol 协议名称 <NSObject>//默认遵守NSObject协议
//方法声明列表
@end; </span>
基本使用:
workProtocol.h
<span style="font-size:24px;">#import <Foundation/Foundation.h>
@protocol workProtocol <NSObject>
-(void)work;
@end</span>
baseProtocol.h
<span style="font-size:24px;">#import <Foundation/Foundation.h>
@protocol baseProtocol <NSObject>
-(void)eat;
-(void)run;
@end</span><span style="font-size: 14.399999618530273px;">
</span>
Person.h
<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "workProtocol.h"
#import "baseProtocol.h"
@interface Person : NSObject<workProtocol,baseProtocol>
@end</span>
Person.m
<span style="font-size:24px;">#import "Person.h"
@implementation Person
-(void)eat{
NSLog(@"人在吃");
}
-(void)run{
NSLog(@"人在努力疯跑");
}
-(void)work{
NSLog(@"人在拼了命的赚钱");
}
@end</span>
main.m
<span style="font-size:24px;">#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p run];
[p work];
[p eat];
}
return 0;
}</span>
运行结果:人在努力疯跑
人在拼了命的赚钱
人在吃
protocol代理设计模式 :
传入的对象,代替当前类完成了某个功能,称为代理模式。
实例分析:保姆照顾婴儿
baomuProtocol.h
#import <Foundation/Foundation.h>
#import "Baby.h"
@protocol baomuProtocol <NSObject>
//喂宝宝吃饭
-(void)feedBaby:(Baby *) baby;
//哄宝宝睡觉
-(void)sleepBaby:(Baby *) baby;
@end
Baby.h
#import <Foundation/Foundation.h>
//#import "baomuProtocol.h"
@class Baomu;
@interface Baby : NSObject
@property (nonatomic,strong)Baomu *BM;
@property (nonatomic,assign)float blood;
@property (nonatomic,assign)float sleep;
//宝宝的行为,不过只会哭
-(void)wantEat;
-(void)wantSleep;
@end
Baby.m
#import "Baby.h"
#import "Baomu.h"
@implementation Baby
//宝宝的行为,不过只会哭
-(void)wantEat{
NSLog(@"宝宝在哭。。。");
[self.BM feedBaby:self];
}
-(void)wantSleep{
NSLog(@"宝宝在哭。。。");
[self.BM sleepBaby:self];
}
@end
Baomu.h
#import <Foundation/Foundation.h>
#import "baomuProtocol.h"
//@class Baby;
@interface Baomu : NSObject<baomuProtocol>
@end
Baomu.m
#import "Baomu.h"
#import "Baby.h"
@implementation Baomu
//喂宝宝吃饭
-(void)feedBaby:(Baby *) baby{
baby.blood += 29;
NSLog(@"保姆正在喂宝宝喝奶粉!");
NSLog(@"baby.blood = %.2f",baby.blood);
}
//哄宝宝睡觉
-(void)sleepBaby:(Baby *) baby{
baby.sleep += 13;
NSLog(@"保姆正在哄宝宝睡觉觉!");
NSLog(@"baby.blood = %.2f",baby.sleep);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Baomu.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Baby *baby = [Baby new];
Baomu *baomu = [Baomu new];
baby.BM = baomu;
baby.blood = 5;
baby.sleep = 3;
[baby wantEat];
[baby wantSleep];
}
return 0;
}
运行结果:宝宝在哭。。。
保姆正在喂宝宝喝奶粉!
baby.blood = 34.00
宝宝在哭。。。
保姆正在哄宝宝睡觉觉!
baby.blood = 16.00