黑马程序员——OC学习——Protocol和代理设计模式

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


1. 什么是protocol
protocol定义了一些方法的声明,但是不实现,类似Java中的接口,自己只声明方法,但不实现,而由遵守了协议的类去实现方法。protocol声明方法,但是不能声明变量。
协议的作用——供其他类去遵守,如果一个类遵守了一个协议,就应该实现这个协议中必须要实现的方法。

protocol的定义格式如下:
@protocol 协议名称 <NSObject>
//方法声明列表
@end

类遵守协议,类可以遵守一个协议也可以遵守多个协议:
类遵守一个协议:
@interface 类名:父类<协议名称>
//方法声明列表
@end
类遵守多个协议:
@interface 类名:父类<协议名称1,协议名称2,... >
//方法声明列表
@end

2. protocol的使用注意事项
a. 声明方法,但是不能实现
b. 某个类遵守了一个协议,就有了协议中所有方法的声明
c. 若父类遵守了某个协议,则子类也遵守
d. protocol声明的方法可以让任何类去实现
e. OC不能继承多个类但可以遵守多个协议
f. 协议可以遵守协议,一个协议遵守了另外一个协议,就可以拥有另一个协议中方法的声明

3. protocol中的方法是否必须实现
protocol中用@required 和@optional控制方法是否必须实现,@required修饰的方法必须要实现,@optional修饰的方法可实现也可不实现,OC中默认是@required

4. protocol代理设计模式
代理设计模式是通过传入的对象代替当前类完成某个功能
代理设计模式的思路:
a. 定义一个协议,里面声明代理类需要实现的方法列表
b. 创建一个代理类,遵守上面的代理协议
c. 在需要代理的类中定义一个对象,类型为id且遵守代理协议的成员变量(delegate)
d. 在需要代理的类中调用成员变量的delegate的方法,即调用代理类的方法
e. 在mian.m或其他需要使用代理类的文件中,为需要代理类的成员变量赋值

代理模式示例代码:
#import <Foundation/Foundation.h>
//定义协议
@protocol LookBaby <NSObject>
//声明协议中的方法
-(void)feedBaby;
-(void)makeBabySleep;
@end

#import <Foundation/Foundation.h>
#import "LookBaby.h"
//代理类采纳协议
@interface Nancy : NSObject<LookBaby>
@end

//代理类实现协议中的方法
#import "Nancy.h"
@implementation Nancy
-(void)feedBaby{
    NSLog(@"保姆正在喂小孩吃饭");
}
-(void)makeBabySleep{
    NSLog(@"保姆正在哄小孩睡觉");
}
@end

#import <Foundation/Foundation.h>
#import "LookBaby.h"
@class Nancy;
@interface BaBy : NSObject
//为Baby定义一个代理对象,该对象遵守代理协议
@property (nonatomic,strong) id<LookBaby> delegate;
//需要代理的类的方法声明
-(void)wantEat;
-(void)wantSleep;
@end

#import "BaBy.h"
#import "Nancy.h"
@implementation BaBy
//调用代理的方法完成所要实现功能
-(void)wantEat{
    [self.delegate feedBaby];
}
-(void)wantSleep{
    [self.delegate makeBabySleep];
}
@end

//在main方法中实现
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        BaBy *baby=[BaBy new];
        Nancy *nancy=[Nancy new];
        baby.delegate=nancy;//给需要代理的类的对象设置代理
        [baby wantEat];
        [baby wantSleep];      
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值