`
MagicBird
  • 浏览: 137294 次
  • 性别: Icon_minigender_2
  • 来自: 惠州
社区版块
存档分类
最新评论

Day16 oc protocol协议

    博客分类:
  • ios
阅读更多

protocol协议的使用

创建文件,选择object c - protocol,只有.h文件

 

@protocol Myprotocol
{
-(void)test1;
@required//默认,要求实现,不实现会发出警告,方便协同交流(不同于java中接口不实现会报错)
-(void)test2;
@optional//不要求实现
-(void)test3;
}
协议关键字:required、optional

 

用来声明方法,类想要拥有这些方法,只需遵守这个协议

 

#import “MyProtocol.h”
//:继承<>遵守协议
@interface Person:NSObject <MyProtocol>
@end
在.m文件中实现方法
@implementation Person
-(void)test1
{
}
-(void)test2
{
}
@end
 因此协议的基本用途
1、可以用来声明一大堆方法,不能声明成员变量
2、只要类遵守了这个协议,相当于拥有这个协议所有方法的声明
3、只要父类遵守了这个协议,相当于子类也遵守了

多个协议

继承只能有一个,oc是单继承,协议可以遵守多个

 

#import “MyProtocol1.h”
#import “MyProtocol1.h”

@interface Person:NSObject <MyProtocol1,MyProtocol2>
@end

 

 

基协议

协议遵守协议:一个协议遵守另一个协议,即可拥有另一个协议的所有方法声明

 

 

@protocol MyProtocol3 <MyProtocol1,MyProtocol2>
@end

 NSObject是一个基协议,而基类NSObject遵守基协议,因此所有继承了NSObject也遵守基协议。任何协议要遵守基协议 。

 

变量遵守协议

 

NSObject<MyProtocol> *obj1 = [[Person alloc] init];//注意Person要遵守MyProtocol协议,否则会有警告
id<MyProtocol> obj2 = [[Person alloc] init];
@property (nonatomic, strong) id<MyProtocol> obj3;
@property (nonatomic, strong) Person<MyProtocol> obj4;

 

协议的提前声明 

//.h文件中
//原#import "MyProtocol.h"改为
@protocol MyProtocol;

//.m文件中实际用到再导入
#import "MyProtocol.h"

 也可以直接写在类头文件中,当协议只有当前类用时,协议写在里面,如下

 

@protocol MyProtocol<NSObject>
-(void)test;
@end

@interface Student:Person<MyProtocol>
@end

 当协议多个类使用时,写单独文件,同理category也可写类中(大部分单独文件中)

代理(委托)设计模式

就是一个人让另一个人帮助他做某事

协议的定义

 

@protocol TicketDelegate <NSObject>
//票价
- (double) ticketPrice;
//剩了多少张票
- (int) leftTicketNumber;
@end

 

 

 代理遵守协议并实现方法

@interface Agent : NSObject <TicketDelegate>

@end

 

 

 

@implementation Agent
- (double) ticketPrice
{
}
- (int) leftTicketNumber
{
}
@end

 

 

 person类中_delegate这个对象代表着所使用的代理,当person需要换成另一个代理时会很麻烦,因此使用万能指针 id类型, 这样就可以不用每次都改变代码,但是这样使用id声明调用方法的时候系统不知道调用谁,这属于运行期的多态。在编译期无法识别代理类的方法,我们需要一个更灵活低耦合的模式即利用协议 ,当做一个 “用户”与 “代理”之间的中转站。

@interface Person : NSObject

- (void) buyTicket;

//拥有一个代理,必须遵守协议
@property (nonatomic,retain) id<TicketDelegate> delegate;

@end

 

@implementation Person

//想看电影
- (void) buyTicket
{
    //让代理帮忙买票
    double price = [_delegate ticketPrice];
    int number = [_delegate leftTicketNumber];
    NSLog(@"通过代理知:票价 = %f,剩余票数 = %d",price, number);
}
@end

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics