代理模式
官方解釋
Delegation is a simple and powerful pattern in which one object in a program acts on behalf of, or in coordination with, another object. The delegating object keeps a reference to the other object—the delegate—and at the appropriate time sends a message to it. The message informs the delegate of an event that the delegating object is about to handle or has just handled. The delegate may respond to the message by updating the appearance or state of itself or other objects in the application, and in some cases it can return a value that affects how an impending event is handled. The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.
翻譯過來就是:
代理是一種簡單而功能強大的設(shè)計模式森瘪,這種模式用于一個對象“代表”另外一個對象和程序中其他的對象進行交互巡揍。 主對象(這里指的是delegating object)中維護一個代理(delegate)的引用并且在合適的時候向這個代理發(fā)送消息瓷们。這個消息通知“代理”主對象即將處理或是已經(jīng)處理完了某一個事件岗钩。這個代理可以通過更新自己或是其它對象的UI界面或是其它狀態(tài)來響應(yīng)主對象所發(fā)送過來的這個事件的消息审磁」憾裕或是在某些情況下能返回一個值來影響其它即將發(fā)生的事件該如何來處理。代理的主要價值是它可以讓你容易的定制各種對象的行為觅够。注意這里的代理是個名詞胶背,它本身是一個對象,這個對象是專門代表被代理對象來和程序中其他對象打交道的喘先。
舉個栗子說就是钳吟,我想做租房子,但是不知道怎么租窘拯,所以我找房屋中介幫我租红且。
協(xié)議的編寫規(guī)范:
1.一般情況下, 當(dāng)前協(xié)議屬于誰, 我們就將協(xié)議定義到誰的頭文件中
2.協(xié)議的名稱一般以它屬于的那個類的類名開頭, 后面跟上protocol或者delegate
3.協(xié)議中的方法名稱一般以協(xié)議的名稱protocol之前的作為開頭
4.一般情況下協(xié)議中的方法會將觸發(fā)該協(xié)議的對象傳遞出去
5.一般情況下一個類中的代理屬于的名稱叫做 delegate
6.當(dāng)某一個類要成為另外一個類的代理的時候,一般情況下在.h中用@protocol 協(xié)議名稱;告訴當(dāng)前類 這是一個協(xié)議.
代碼示例:
在SecViewController.h中
//第一步:定義一個協(xié)議
@protocol SecViewControllerDelegate <NSObject>
// 第二部:聲明需要做的事的方法
@required //必須實現(xiàn)的方法
- (void)changeBackViewColor:(UIColor *)color;
@optional //可選實現(xiàn)的方法
- (void)hadText:(NSString *)text;
@end
@interface SecViewController : UIViewController
// 第三步:用id類型存儲改協(xié)議,命名為delegate(這里最好用weak類型)
@property (nonatomic, weak) id<SecViewControllerDelegate> delegate;
@end
在SecViewController.m文件中
- (void)back{
[self.delegate changeBackViewColor:[UIColor orangeColor]];
[self.delegate hadText:@"text-----text"];
[self.navigationController popViewControllerAnimated:YES];
}
>在ViewController.m文件中
> ```
>//繼承協(xié)議
>@interface ViewController () <SecViewControllerDelegate>
>//成為代理
>SecViewController *svc = [[SecViewController alloc] init];
svc.delegate = self;
>// 實現(xiàn)代理方法
> - (void)changeBackViewColor:(UIColor *)color
{
self.view.backgroundColor = color;
}
- (void)hadText:(NSString *)text
{
NSLog(@"%@",text);
}
通知方法
很簡單涤姊,就是一個發(fā)通知暇番,一個接收到這個通知然后做事情,但是用多了不好了思喊,容易亂壁酬,項目中太多的通知,給人感覺就沒有逼格了,哈哈厨喂,還是多用代理和Block
[[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeBack" object:@"參數(shù)"];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(change:) name:@"ChangeBack" object:nil];
}
- (void)change:(NSNotification *)notification {
NSLog(@"%@",notification.object);
}
最后別忘了,在不用的時候給銷毀
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:@"ChangeBack" ];
}
MarkDown文本和代碼均可在github上下載:GitHub地址 : CoderVan