概念atom
簡單來講就是一系列方法的列表,其中生命的方法能夠不餓任何類實現,這種模式通常稱爲代理(delegation)模式。不就是C#的接口噻。OC叫協議,代理和監聽器思想是同樣的。spa
在iOS和OS X開發中,Apple採用了大量的代理模式來實現MVC中View(UI控件)和Controller(控制器)的解耦。設計
--------------------------------------代理
在OC中協議中的協議不會被強制實現orm
---------------------------------------對象
建立一個按鈕類Button繼承
寫協議的潛規則:ButtonDelegate接口
Button.h內存
@protocol ButtonDelegate <NSObject>開發
//<實現某個協議>(分類):繼承
-(void)onClick;
@end
@interface Button:NSObject
@property (nonatomic,retain) id<ButtonDelegate> delegate;
// click button;
-(void)click;
@end
Button.m
#import "Button.h"
-(void)dealloc{
[_delegate release];
[super dealloc];
}
-(void)click{
//button is click then inform listener.
[_delegate onClick];
}
--------------------------------------------
建立一個普通的類ButtonListener
ButtonListener.h
// #import "Button.h"
@protocol ButtonDelegate; ->對協議進行提早聲明 與@class用途一致
@interface ButtonListener:NSObject<Buttondelegate>
@end
ButtonListener.m
#import "ButtonListener.h"
#import "Button.h"//由於用到協議的方法 因此必須import
-(void)onClick{
NSLog(@"The button is clicked.");//deal with you want to realize on click
}
main.m
#import "Button.h"
#import "ButtonListener.h"
Button *button= [[[Button alloc]init]autorelease];//initialize button
ButtonListener *buttonListener = [[[buttonListener alloc]init]autorelease];
//initializa a listener
botton.delegate=listener; //set listener to button
//click button
[button click]; // simulate the button is clicked
ButtonListener.m
----------------------
總結,button 有一個delegate
監聽器有好幾個,只要監聽器實現這個delegate的onClick方法,就能夠監聽button,自主選擇。
通知監聽器的惟一方式就是調用監聽器的對象。
-----------------------------------------------
可是這種狀況下,監聽器和按鈕沒有鎖定什麼的,兩個按鈕均可以用這個監聽器,因此就是不知道監聽的是哪一個按鈕?因此在寫監聽器的時候當按鈕被點擊要告訴監聽器哪一個按鈕被點擊了。。
所以改成
---------------------------------------------------
Button.h
@class Button
@protocol ButtonDelegate<NSObject>
-(void)onClick:(Button *)btn;
@end
@interface Button :NSObject
@property (nonatomic,retain) id<ButtonDelegation> delegation;
-(void)click;
@end
Button.m
-(void)dealloc{
[_delegate release];
[super dealloc];
}
-(void)click{
//按鈕被點擊了,應該通知監聽器,而且告訴監聽器哪一個按鈕被點擊了。
if([_delegate respondToSelector:@selector(onClick:)]){
[_delegate onClick:self];
} //若是delegate有實現onClick:這個方法 再調用
else{
NSLog(@"監聽器並無實現onClick:方法");
}
}
@end
---------------------------------------------------------
可是第二個監聽器沒有實現帶參數的代理
//unrecognized selector sent to instance 某個對象沒有這個方法 你硬要調用時就會產生這個錯誤
-------------------------------------------------------------
//ADD
ButtonListener.m
-(void)onClick:(Button *)btn{
NSLog(@"ButtonListener 能夠監聽到按鈕-%@被點擊了",btn);//內存地址
}
-0------------------------------------------
設計監聽器原則:
那個對象觸發監聽器,就把那個對象傳過去