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是弱語法的,所以不實現,編譯器並不會報錯。