ios 协议和代理

释放双眼,带上耳机,听听看~!

在ios中,提到协议(protocol)必然涉及代理(delegate), 反之亦然。

1. 协议:在ios中没有其他语言的接口或是虚函数这一说,但是有一个类似的功能,就是协议:声明一组方法规范。

下面以租房为例:

//协议

@protocol rentRoom<NSObject>

@requested


-(void)getRoom; // 找房子

@optional:


-(int)price;

-(CGFloat)area;

@end

 

中介看到了我贴的这份租房协议,想挣点中介费,就开始帮我推荐符合上述的房子。

//.h

//中介

@interface Intermediary:NSObject<rentRoom>

@end

//.m

@implement Intermediary

-(int)price{


return 2000;

}

-(void)getRoom{

  return YES;

}




-(CGFloat)area{


return 32.5;

}

@end

 

上述就是协议,看完之后,是不是觉得这不是借口,或者说是虚函数吗?这么理解也没错,但有点偏差,ios的继承是@interface subClass:supClass,

协议是@interface subClass:supClass<youProtocal>或是@interface youClass<youProtocal>,这里叫遵守某个协议,不是继承!

另外,我们知道ios不支持多继承,但是可以遵守多个协议,多个协议之间用逗号隔开,从而实现类似的共功能功能:

@interface subClass:supClass<youProtocal, moyProtocal>


//TODO

@end

 

至于上面的@requested 和@optional是说明协议方法是否必须实现,前者必须是,后者可以不实现,但没有实现的请忽调用(事实是,这只是一个约定,声明为@requested,如果你用不到不实现也可以,但是会有烦人的警告);

 

2. 代理:是一种设计模式,但没必要特意先去看代理模式,不影响理解。

代理就是没有能力或是不想做弄事,使唤别人来做。

接着上面的租房子,我现在工作很忙,但又想换房子,所以我打个电话给中介,说我要找房子,我跟中介说了一下房子的条件(协议):价格是2000/月,面积是32平的,就是上面的rentRoom协议了

 

//.h 找房子类

@interface Me:NSObject{

@property (nonatomic, strong) Intermediary * _Intermediary; //中介


@property (nonatomic, assign) id<rentRoom> delegate;

}

-(void)setUpDelegate:(id<rentRoom>)dg;

-(void)findRoom;

@end

 

//.m




-(void)setUpDelegate:(id<rentRoom>)dg

  self.delegate = dg;


}

-(id)init{

if([super init]){

_Intermediary =[[Intermediary  alloc] init];


}

}




-(void)findRoom{


if([self.delegate responsesToSeletor[@selector(getRoom)]]){

[self.delegate getRoom];

}

}

 

Me类应该拥有代理(@property (nonatomic, assign) id<rentRoom> delegate),否则无法设置代理。

也就是说只要中介(代理)遵守了我制定的协议,不论是长寿路的,还是祥德路的中介,都可帮我我找房子,也就是成为我的代理。

 

 

人已赞赏
iOS文章

iOS开发UIGraphicsGetCurrentContext()的使用

2020-2-6 11:22:11

iOS文章

iOS监听系统键盘的弹起和回收

2020-2-6 12:33:13

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索