協議和代理,協議代理
==========================
協議和代理
==========================
【協議】
@protocol
【協議的作用】:規定了需要實現的介面方法,在委託方和代理方都需要遵從的一個協議。
委託方通過(nt.delegate = self;)這種方式進行委託【注,不僅可以委託自己,也可以委託其他的類】
代理方通過([_delegate test];)這種方式進行方法的代理(替...幹了....)
【例如】:
小明是委託方,小剛是代理方。他們之間都遵從一個協議。協議中規定了2個方法(功能);小明把自己委託給了小剛,小剛則擁有了指向小明的對象的指標,通過這個指標可以訪問小明的任何方法(必須是協議中規定的方法)
【注】協議中的方法有如下2中許可權
1.@required//委託方(小明)必須實現這個方法
2.@optional//委託方(小明)可以實現,也可以不實現這個方法
【注】@required要求的方法如果不實現,則會提示警告,@optional如果不實現,則沒有任何問題。
【注】使用哪個協議,必須包含協議的標頭檔。
【代理和協議的添加方式】
1.包含標頭檔
2.在委託方添加協議,然後實現協議方法
3.在代理方實現代理物件變數。
4.在委託方,給代理物件變數賦值
5.在需要用到的地方,通過代理對象的變數,去訪問委託的方法
#import <Foundation/Foundation.h>
#import "xiaoming.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
xiaoming* xm = [[xiaoming alloc]init];
// 測試用的
[xm method];
}
return 0;
}
#import <Foundation/Foundation.h>
#import "print.h"
#import "xiaoming.h"
#import "xiaogang.h"
@implementation xiaoming
// 在method這個方法裡面練習委託和代理的用法
- (void)method
{
xiaogang* xg = [[xiaogang alloc]init];
// 把自己委託給了小剛,這是一個賦值的過程
xg.woshidaili = self;
// 測試代理程式是否好用
[xg test];
}
- (void)OutPutPersonInfo
{
NSLog(@"我是委託方,我委託小剛去幹一件事情");
}
@end
#import <Foundation/Foundation.h>
#import "print.h"
@interface xiaoming : NSObject<print>
- (void)method;
@end
#import <Foundation/Foundation.h>
#import "print.h"
@interface xiaogang : NSObject
// woshidaili 是一個自訂類型 ,類型是:id<print>
// 可以理解為:是id類型,只是這個id類型遵從了協議
// 【注】id後的角括弧肯定是跟著協議的名稱
@property id<print> woshidaili;
// 用來測試代理程式是否好用
- (void)test;
@end
#import "xiaogang.h"
@implementation xiaogang
- (void)test
{
// 通過代理對象的變數 去訪問委託方的方法
[_woshidaili OutPutPersonInfo];
}
@end
#import <Foundation/Foundation.h>
@protocol print <NSObject>
// 列印個人資訊
- (void)OutPutPersonInfo;
@end
【協議和代理用處】
例如商品頁的商品購買,但是使用者沒登陸,需要先登陸,登陸成功後,需要把狀態告訴商品頁,商品頁判斷登陸狀態,然後繼續進行下一步操作。【注】登陸頁就是在商品頁中建立出來的一個對象;【代理的回調】
【協議和代理局限性】
只能是2個相關聯的類之間進行資料的互相訪問。
【例如】小明委託小剛乾什麼;小剛委託小紅幹什麼
【respondsToSelector方法】
作用:使代碼更安全,防止崩潰
// 判斷OutPutPersonInfo 方法是否存在,存在跳入方法
if([_woshidaili respondsToSelector: @selector(OutPutPersonInfo:)])
{
[_woshidaili OutPutPersonInfo: @"我是小剛"];
}