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

来源:互联网 发布:斗战胜佛工艺品知乎 编辑:程序博客网 时间:2024/05/22 02:22

------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;}

1 0
原创粉丝点击