oc中的协议很像Java中的接口,定义一组约定俗成的规范,让其他类来实现,而protocol主要是为了监视这个对象的活动信息,这样看起来到像是数据库端的触发器了,一旦满足某个规则,我就执行某个事件。
#import <Foundation/Foundation.h> @class MessageCenter; //定义一个消息中心的协议 @protocol MessageDelegate <NSObject> -(void)sendMessage:(MessageCenter *) center; @required //必须实现 -(void)sum; @optional //可实现也可不实现 -(void)min;
@end
----------------------------------------------------------------------------------------- @interface MessageCenter :NSObject @property (nonatomic,retain)id<MessageDelegate> delegate; -(void)send; @end #import "MessageCenter.h" @implementation MessageCenter -(void)send{ //判断某个协议是否存在某个方法 if([_delegaterespondsToSelector:@selector(sendMessage:)]){ [_delegatesendMessage:self]; } } - (void)dealloc { [_delegate release]; [superdealloc]; } @end |
#import <Foundation/Foundation.h> @protocolMessageDelegate; @interface SmsListener :NSObject <MessageDelegate> @end |
#import "SmsListener.h" #import "MessageCenter.h" @implementation SmsListener -(void)sendMessage:(MessageCenter *)center{ NSLog(@"正在发送消%@",center); } @end |
#import <Foundation/Foundation.h> #import "MessageCenter.h" #import "SmsListener.h" int main(int argc,constchar * argv[]) { @autoreleasepool { MessageCenter *m=[[[MessageCenteralloc]init]autorelease]; SmsListener *listener=[[[SmsListeneralloc]init]autorelease]; m.delegate=listener; [m send]; SmsListener *sm=[[[SmsListeneralloc]init ]autorelease]; if([smconformsToProtocol:@protocol(MessageDelegate)]){ //判断是否存在某个协议 NSLog(@"存在协议"); } |
}
return0;
}
总结:
1.判断协议是否存在某个方法:协议名称 respondsToSelector:@selector(方法名称)
2.判断对象是否存在某个协议:对象名称 conformsToProtocol:@protocol(协议名称)
3.协议中的方法前面如果加了@required,必须实现,如果加了@optional可实现也可不实现,默认是@required,但是因为OC是弱语法的,所以不实现,编译器并不会报错。